问题
I have got a ImageIcon
in a Jlabel
in a JFrame
(Java GUI).
The ImageIcon
should get updated based on pressing a Calculate button (i.e. calcButton.addActionListener(new ActionListener()
) with part of the code in the method:
icon2 = new ImageIcon("M:\\Repos\\rtrans\\radTransPlot.png");
Plot1.setIcon(icon2);
frame.add(Plot1,gc);
frame.setVisible(true);
The initial ImageIcon
(icon1) is blank:
public class RadTransGui
{
private ImageIcon icon1 = new ImageIcon("M:\\Repos\\rtrans\\radTransPlotEmpty.png");
private ImageIcon icon2;
private JLabel Plot1 = new JLabel(icon1);
and gets properly updated based on the first Calculate button press but not after subsequent presses of Calculate button. The contents of M:\Repos\rtrans\radTransPlot.png gets updated correctly each time Calculate is pressed.
I have tried setting the ImageIcon to null and adding and removing the JLabel to the frame each time the Calculate button is pressed.
Any ideas? Thanks.
回答1:
The constructor of ImageIcon() internally uses Toolkit.getDefaultToolkit().getImage
.
You have to manually use Toolkit.getDefaultToolkit().createImage
instead of Toolkit.getDefaultToolkit().getImage
. The latter uses cache whereas the former doesn't and always returns a new instance.
new ImageIcon(Toolkit.getDefaultToolkit().createImage("..filename.."))
From the javadoc of createImage
:
The returned Image is a new object which will not be shared with any other caller of this method or its getImage variant.
Compare with the javadoc of getImage
:
The underlying toolkit attempts to resolve multiple requests with the same filename to the same returned Image. [...] If the image data contained in the specified file changes, the Image object returned from this method may still contain stale information which was loaded from the file after a prior call.
There seems to be no javadoc or spec that prescribes that ImageIcon should use cached images, so it's a perfect example of how fragile programming is if you don't know 100% what you're doing. Even if it works in one environment doesn't guarantee it always works.
来源:https://stackoverflow.com/questions/60952313/java-imageicon-image-file-updating-but-image-icon-in-java-frame-not