![](/img/trans.png)
[英]Can I change the location of the ImageIcon that I put on a JLabel in my code?
[英]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
}
}
所以我想做的是:
除尝试加载新图像外,这四个步骤正常工作。 我遇到的问题是,当我在现有图像之上加载新图像时,它会擦除旧图像(按预期),然后在新图像周围打包框架时(例如,较小的图像),它将保持会根据旧图像来设置最小尺寸要求,而不设置最小尺寸(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
,Frame
和Dialog
)的位置和大小受桌面窗口管理系统的控制。 对setLocation
,setSize
和setBounds
调用是转发到窗口管理系统的请求(不是伪指令)。 将尽一切努力满足这些要求。 但是,在某些情况下,窗口管理系统可能会忽略此类请求,或修改请求的几何形状,以便以与桌面设置更匹配的方式放置和调整Window
大小。由于本机事件处理的异步特性,在处理完最后一个请求之前,由
getBounds
,getLocation
,getLocationOnScreen
和getSize
返回的结果可能无法反映屏幕上Window的实际几何形状。 在后续请求的处理期间,窗口管理系统满足请求时,这些值可能会相应更改。
通常,这可以通过使用invokeLater来容纳:
this.pack();
EventQueue.invokeLater(() -> {
this.setMinimumSize(this.getSize());
enableButtons();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.