当前位置: 首页 > 知识库问答 >
问题:

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

杭曦
2023-03-14

这是我的代码:

/**
 * 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. 加载像素图像 (myImage)
  2. 将 ImageIcon (myImageIcon) 设置为 PixelImage (myImage)
  3. 将 JLabel (myImageLabel) 设置为 ImageIcon (myImageIcon)
  4. 在图像周围包装框架以适当调整大小,并在加载图像后设置框架的最小大小以满足框架的尺寸。

这四个步骤工作正常,除了当我试图加载一个新的图像。我遇到的问题是,当我在现有图像上加载新图像时,它会擦除旧图像(如预期的那样),然后当它在新图像周围打包框架(比如一个较小的图像)时,它会根据旧图像保持框架的最小大小要求,而不是设置最小大小(this . setminimumsize(this . getsize())。如果我加载一个较小的图像,我希望我的框架调整大小,以满足这些较小的图像的高度和宽度,而不是基于旧的图像。

共有2个答案

葛雪松
2023-03-14

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

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

这在Window类的文档中有描述:

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

由于本机事件处理的异步特性,在处理完最后一个请求之前,< code>getBounds 、< code>getLocation 、< code > getlocationscreen 和< code>getSize返回的结果可能不会反映屏幕上窗口的实际几何形状。在后续请求的处理过程中,当窗口管理系统满足请求时,这些值可能会相应地改变。

通常,这可以通过以下方式来解决:

this.pack();
EventQueue.invokeLater(() -> {
    this.setMinimumSize(this.getSize());
    enableButtons();  
});
曾弘扬
2023-03-14

也许可以试试这样的东西:

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

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

 类似资料:
  • 问题内容: 我正在制作一个具有以下布局()的Java Swing应用程序: 当用户添加或删除图标时,其他图标应缩小或增长。 我的问题很简单:我有一个包含;如何调整此图标的大小? 问题答案: 调整图标大小并不容易。您需要使用Java的2D图形来缩放图像。第一个参数是Image类,您可以从类中轻松获取。您可以使用class加载图像文件,然后只需调用getter方法即可获取图像。

  • 本文向大家介绍如果我们尝试从未打开的CURSOR中获取,将会得到什么结果?如果我们尝试打开一个已经打开的游标,结果将是什么?,包括了如果我们尝试从未打开的CURSOR中获取,将会得到什么结果?如果我们尝试打开一个已经打开的游标,结果将是什么?的使用技巧和注意事项,需要的朋友参考一下 当我们尝试从未打开的CURSOR中获取数据时,查询将失败。在这种情况下,SQLCA的SQLCODE字段将填充DB2错

  • 问题内容: 我想使用JLabel(Icon)来显示来自我网站(http://xxx.xxx.xxx.xxx/java_pic/test.jpg)的图像。我有一个刷新按钮来新建一个新的JLabel和ImageIcon(以获取最新的图像)该程序成功运行…但是当我上载新图像以覆盖旧图像时(http://xxx.xxx。 xxx.xxx/java_pic/test.jpg ),我按了刷新按钮…什么都没发生

  • 问题内容: 如果我有 然后,如果我创建 并执行 自行车的速度也会改变吗?如果没有,那有什么办法吗? 问题答案: 是的,它将改变。Java Assignment操作仅创建对该对象的新 引用 。换句话说写类似 会 不会 复制对象中的所有值。objectA和objectB都指向该类的相同 实例 。 如果要复制对象的所有值,则应查看克隆

  • 问题内容: 我正在尝试在上显示图像。我正在使用渲染图像,并且图像与类文件位于同一目录中。但是,没有显示图像,并且没有发生错误。谁能帮忙弄清楚我的代码有什么问题… 问题答案: 你应该用