Буферирана ли е иконата?

Когато щракна върху бутона Показване на диалоговия прозорец, се появява JDialog, който има JLabel с икона (изображение), ако файлът C:\Test\Test.png съществува, изображението се показва правилно. Имам външен процес, който през деня актуализира това изображение (винаги използвайки същото име Test.png). Но проблемът ми е, че дори да изхвърля jdialog и изображението се актуализира (приложението все още работи), когато щракна отново върху Покажи диалоговия прозорец, jdialog се показва със старото изображение (изглежда, че старото изображение е в буфер някъде ). Дори ако затворя jdialog, изтрия файла и го отворя отново, изображението се показва.

Има ли начин да го предотвратим?

Това, от което се нуждая, е, когато отворя jdialog, той показва актуализираното изображение.

import java.awt.Dimension;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class ShowImage implements Runnable {

    @Override
    public void run() {
        createGUI();
    }

    public void createGUI() {
        JButton jButton = new JButton("Show dialog");
        jButton.addActionListener((e) -> new ShowImageWindow());

        JFrame jFrame = new JFrame();
        jFrame.add(jButton);
        jFrame.pack();
        jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ShowImage());
    }
}

class ShowImageWindow extends JDialog {
 
    private JLabel imagemJLabel;

    public ShowImageWindow() {
        initComponents();
    }
    
    public void initComponents() {
        Icon preview = new ImageIcon("C:\\Test\\Test.png");
        System.out.println(preview.toString());
        imagemJLabel = new JLabel();
        imagemJLabel.setHorizontalAlignment(SwingConstants.CENTER);
        imagemJLabel.setIcon(preview);
        
        JPanel contentPane = new JPanel();
        contentPane.add(this.imagemJLabel);
        
        setSize(new Dimension(500, 500));
        setModal(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setContentPane(contentPane);
        setVisible(true);
    }
}

Благодаря.


person Aislan Nadrowski    schedule 08.01.2021    source източник
comment
Можете да поставите булевото значение в главния клас и да го предадете като параметър на конструктора ShowImageWindow, ако абсолютно искате да създавате отново диалоговия прозорец всеки път   -  person Hovercraft Full Of Eels    schedule 08.01.2021
comment
Здравей @HovercraftFullOfEels, не съм сигурен дали го разбрах. Създадох този въпрос, защото основният ми проблем е: има външен процес, който през деня актуализира изображението (т.е. C:\Test\Test.png) винаги използвайки същото име Test.png. Но начинът, по който е кодът ми, винаги показва първото изображение, когато отворя приложението. Дори винаги да създавам отново jdialog, винаги се показва първото изображение.. дори ако го изтрия или актуализирам.. (съжалявам за лошия ми английски). Благодаря.   -  person Aislan Nadrowski    schedule 08.01.2021
comment
Не трябва ли да поставите тази информация в основния въпрос? Без него въпросът е невалиден и моят отговор и усилия безсмислени. Моля, прочетете Как да питате и след това редактирайте въпроса си, предоставяйки всички ключови подробности, горната информация и още   -  person Hovercraft Full Of Eels    schedule 08.01.2021
comment
Отново добавете всички подробности, включително как и кога се променя изображението, какъв процес го променя, .... достатъчно информация, така че хората да не се налага да гадаят за нищо   -  person Hovercraft Full Of Eels    schedule 08.01.2021
comment
@HovercraftFullOfEels прав си. съжалявам нека го подобря.   -  person Aislan Nadrowski    schedule 08.01.2021
comment
Вече отговорих на това тук: Java: ImageIcon - файл с изображение се актуализира, но иконата на изображение в рамката на Java не   -  person Mark Jeronimus    schedule 08.01.2021
comment
извинения -- включва се кеширане. Опитахте ли да получите вашето изображение чрез ImageIO.read(...)? 1+ към отговора на @MarkJeronimus, благодаря   -  person Hovercraft Full Of Eels    schedule 08.01.2021
comment
Мисля, че Toolkit.getDefaultToolkit().createImage обикновено е по-безопасният начин за зареждане на изображения за дисплей, докато използвам ImageIO.read за зареждане на изображения за анализ/манипулация.   -  person Mark Jeronimus    schedule 08.01.2021
comment
Публикацията на @MarkJeronimus проработи за мен, благодаря на всички!   -  person Aislan Nadrowski    schedule 08.01.2021
comment
Ако отговорът на @MarkJeronimus в другия въпрос ви е помогнал, моля, не забравяйте да гласувате за него   -  person Hovercraft Full Of Eels    schedule 08.01.2021
comment
@HovercraftFullOfEels как мога да направя това?   -  person Aislan Nadrowski    schedule 08.01.2021
comment
Свършен! но.. Благодаря за обратната връзка! Гласовете, подадени от тези с по-малко от 15 репутация, се записват, но не променят публично показвания резултат от публикацията. Благодаря на всички ви!   -  person Aislan Nadrowski    schedule 08.01.2021