Java: ImageIcon - обновление файла изображения, но значок изображения в Java рамке отсутствует - PullRequest
0 голосов
/ 31 марта 2020

Я получил 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 на ноль и добавить и удаление JLabel на раме каждый раз, когда нажимается кнопка Рассчитать .

Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 31 марта 2020

Конструктор ImageIcon () внутренне использует Toolkit.getDefaultToolkit().getImage.

Вы должны вручную использовать Toolkit.getDefaultToolkit().createImage вместо Toolkit.getDefaultToolkit().getImage. Последний использует кэш, тогда как первый не возвращает и всегда возвращает новый экземпляр.

new ImageIcon(Toolkit.getDefaultToolkit().createImage("..filename.."))

Из javado c из createImage:

Возвращенное изображение новый объект, который не будет предоставлен другим пользователям этого метода или его варианту getImage.

Сравните с javado c из getImage:

Базовый набор инструментов пытается разрешить несколько запросов с одним и тем же именем файла для того же возвращенного изображения . [...] Если данные изображения, содержащиеся в указанном файле, изменяются, объект изображения , возвращаемый этим методом, может по-прежнему содержать устаревшую информацию , которая была загружена из файла после предыдущего вызова.

Кажется, не существует javado c или spe c, который предписывает, чтобы ImageIcon использовал кэшированные изображения, так что это прекрасный пример того, как программирование fr agile, если вы не знаете на 100%, что вы делаешь. Даже если он работает в одной среде, это не значит, что он всегда работает.

...