我有一个 ImageIcon
在一个 Jlabel
在一个 JFrame
(java gui)。
这个 ImageIcon
应根据按下计算按钮(即。 calcButton.addActionListener(new ActionListener()
)使用方法中的部分代码:
icon2 = new ImageIcon("M:\\Repos\\rtrans\\radTransPlot.png");
Plot1.setIcon(icon2);
frame.add(Plot1,gc);
frame.setVisible(true);
首字母 ImageIcon
(icon1)为空:
public class RadTransGui
{
private ImageIcon icon1 = new ImageIcon("M:\\Repos\\rtrans\\radTransPlotEmpty.png");
private ImageIcon icon2;
private JLabel Plot1 = new JLabel(icon1);
并基于第一次按下计算按钮而不是在随后按下计算按钮之后正确更新。每次按下calculate时,m:\repos\rtrans\radtransplot.png的内容都会得到正确更新。
我尝试过将imageicon设置为null,并在每次按下calculate按钮时向帧中添加和删除jlabel。
有什么想法吗?谢谢。
1条答案
按热度按时间9avjhtql1#
imageicon()的构造函数在内部使用
Toolkit.getDefaultToolkit().getImage
.您必须手动使用
Toolkit.getDefaultToolkit().createImage
而不是Toolkit.getDefaultToolkit().getImage
. 后者使用缓存,而前者不使用,并且总是返回一个新示例。来自javadoc的
createImage
:返回的图像是一个新对象,不会与此方法或其getimage变量的任何其他调用方共享。
与javadoc比较
getImage
:基础工具箱尝试将具有相同文件名的多个请求解析为相同的返回图像。[…]如果指定文件中包含的图像数据发生更改,则此方法返回的图像对象可能仍然包含在先前调用后从文件加载的过时信息。
似乎没有javadoc或规范规定imageicon应该使用缓存的图像,所以这是一个完美的例子,如果你不100%知道你在做什么,那么编程是多么脆弱。即使它在一个环境中工作也不能保证它总是工作的。