繁体   English   中英

如果我已经有一个带有ImageIcon的JLabel,如果我更改了ImageIcon然后打包框架,则不会打包

[英]If I already have a JLabel with an ImageIcon, If I change the ImageIcon and then pack the frame, it doesn't pack

这是我的代码:

/**
 * 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
    }
}

所以我想做的是:

  1. 加载PixelImage(myImage)
  2. 将ImageIcon(myImageIcon)设置为PixelImage(myImage)
  3. 将JLabel(myImageLabel)设置为ImageIcon(myImageIcon)
  4. 在装入图像后,将其包装成适当的尺寸以适合图像周围,并设置最小尺寸以符合框架的尺寸。

除尝试加载新图像外,这四个步骤正常工作。 我遇到的问题是,当我在现有图像之上加载新图像时,它会擦除​​旧图像(按预期),然后在新图像周围打包框架时(例如,较小的图像),它将保持会根据旧图像来设置最小尺寸要求,而不设置最小尺寸(this.setMinimumSize(this.getSize()))。 如果加载较小的图像,则希望调整框架的大小以适应较小图像的高度和宽度,而不是基于旧图像。

也许尝试类似:

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

所以pack()方法不限于先前的最小值吗? 如果null不起作用,则使用Dimension(0,0)。

尽管有代表Windows的Java类,但Window是系统资源,而Java在很大程度上是无法控制的。 (当然,所有框架和JFrame都是Windows。)

当您调用pack() ,系统会响应调整窗口大小的请求,但可能不会立即生效。 因此,不能保证在对pack()的调用完成时Window的大小会发生变化。

在Window类文档中对此进行了描述:

…顶级窗口(包括WindowFrameDialog )的位置和大小受桌面窗口管理系统的控制。 setLocationsetSizesetBounds调用是转发到窗口管理系统的请求(不是伪指令)。 将尽一切努力满足这些要求。 但是,在某些情况下,窗口管理系统可能会忽略此类请求,或修改请求的几何形状,以便以与桌面设置更匹配的方式放置和调整Window大小。

由于本机事件处理的异步特性,在处理完最后一个请求之前,由getBoundsgetLocationgetLocationOnScreengetSize返回的结果可能无法反映屏幕上Window的实际几何形状。 在后续请求的处理期间,窗口管理系统满足请求时,这些值可能会相应更改。

通常,这可以通过使用invokeLater来容纳:

this.pack();
EventQueue.invokeLater(() -> {
    this.setMinimumSize(this.getSize());
    enableButtons();  
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM