Когато щракна върху бутона Показване на диалоговия прозорец, се появява 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);
}
}
Благодаря.
ImageIO.read(...)
? 1+ към отговора на @MarkJeronimus, благодаря - person Hovercraft Full Of Eels   schedule 08.01.2021Toolkit.getDefaultToolkit().createImage
обикновено е по-безопасният начин за зареждане на изображения за дисплей, докато използвамImageIO.read
за зареждане на изображения за анализ/манипулация. - person Mark Jeronimus   schedule 08.01.2021