Java 如果我已经有一个带有ImageIcon的JLabel,如果我更改ImageIcon然后打包框架,它不会';t包装

Java 如果我已经有一个带有ImageIcon的JLabel,如果我更改ImageIcon然后打包框架,它不会';t包装,java,Java,这是我的密码: /** * Opens file and gives a warning if non image. */ private void openFile() { final int returnVal = myFileChooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { myFile = myFileChooser.getSelectedFile

这是我的密码:

/**
 * Opens file and gives a warning if non image.
 */
private void openFile() {
    final int returnVal = myFileChooser.showOpenDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        myFile = myFileChooser.getSelectedFile();
        try {
            myImage = PixelImage.load(myFile);
            myImageIcon = new ImageIcon(myImage);
            myImageLabel.setIcon(myImageIcon);

            this.pack();
            this.setMinimumSize(this.getSize());
            enableButtons();  
        } catch (final IOException exception) {
            JOptionPane.showMessageDialog(null, 
                        "The selected file did not contain an image!");
        }
    } else {
        System.out.println("ERROR FILE"); //PLACEHOLDER
    }
}
所以我想做的是:

  • 加载像素图像(myImage)
  • 将ImageIcon(myImageIcon)设置为PixelImage(myImage)
  • 将JLabel(myImageLabel)设置为ImageIcon(myImageIcon)
  • 包装框架,使其在图像周围具有适当的尺寸,并设置框架的最小尺寸,以满足加载图像后框架的尺寸要求
  • 这四个步骤正常工作,除非我尝试加载新图像。
    我遇到的问题是,当我在现有图像上加载一个新图像时,它会删除旧图像(如预期的),然后当它在新图像(例如较小的图像)周围打包帧时,它会根据旧图像保持帧的最小大小要求,而不是设置最小大小(this.setMinimumSize(this.getSize()))。如果加载较小的图像,我希望调整帧大小以满足较小图像的高度和宽度,而不是基于旧图像。

    可以尝试以下操作:

    this.setMinimumSize(null);
    this.pack();
    this.setMinimumSize(this.getSize());
    

    那么pack()方法不限于前面的最小值?如果null不起作用,则使用(0,0)维度。

    可以尝试以下操作:

    this.setMinimumSize(null);
    this.pack();
    this.setMinimumSize(this.getSize());
    

    那么pack()方法不限于前面的最小值?如果null不起作用,则使用(0,0)维度。

    尽管有Java类来表示窗口,但窗口是一种系统资源,Java基本上不控制它。(当然,所有框架和JFrame都是窗口。)

    调用
    pack()
    时,系统会响应调整窗口大小的请求,但该请求可能不会立即生效。因此,在调用
    pack()
    完成时,窗口的大小不一定会改变

    以下章节对此进行了描述:

    …顶级窗口(包括
    窗口
    s、
    框架
    s和
    对话框
    s)的位置和大小由桌面窗口管理系统控制。对
    setLocation
    setSize
    setBounds
    的调用是转发到窗口管理系统的请求(不是指令)。我们将尽一切努力满足这些要求。但是,在某些情况下,窗口管理系统可能会忽略此类请求,或修改请求的几何图形,以便以更接近桌面设置的方式放置和调整
    窗口的大小

    由于本机事件处理的异步性质,在处理最后一个请求之前,
    getBounds
    getLocation
    getLocationOnScreen
    getSize
    返回的结果可能不会反映屏幕上窗口的实际几何结构。在处理后续请求的过程中,当窗口管理系统完成请求时,这些值可能会相应地更改

    通常,这可以通过使用:


    虽然有Java类来表示窗口,但窗口是一种系统资源,Java基本上不控制它。(当然,所有框架和JFrame都是窗口。)

    调用
    pack()
    时,系统会响应调整窗口大小的请求,但该请求可能不会立即生效。因此,在调用
    pack()
    完成时,窗口的大小不一定会改变

    以下章节对此进行了描述:

    …顶级窗口(包括
    窗口
    s、
    框架
    s和
    对话框
    s)的位置和大小由桌面窗口管理系统控制。对
    setLocation
    setSize
    setBounds
    的调用是转发到窗口管理系统的请求(不是指令)。我们将尽一切努力满足这些要求。但是,在某些情况下,窗口管理系统可能会忽略此类请求,或修改请求的几何图形,以便以更接近桌面设置的方式放置和调整
    窗口的大小

    由于本机事件处理的异步性质,在处理最后一个请求之前,
    getBounds
    getLocation
    getLocationOnScreen
    getSize
    返回的结果可能不会反映屏幕上窗口的实际几何结构。在处理后续请求的过程中,当窗口管理系统完成请求时,这些值可能会相应地更改

    通常,这可以通过使用:


    当你加载一个更大的图像时,pack工作吗?当你加载一个更大的图像时,pack工作吗?谢谢。我不知道pack()考虑了最小值。谢谢。我不知道pack()考虑了最小值。