プログラムの開始時にフォルダーから読み取られる画像があります。プログラムはインターネットから新しいイメージをダウンロードし、同じファイルパスと同じ名前の古いイメージを上書きしますが、表示されるイメージは古いイメージです。プログラムを終了して再ロードすると、新しい画像が表示されます。ファイルパスから新しい ImageIcon を作成し、ダウンロード後に JDialog に表示しようとしたため、画像が変更されていないことはわかっていますが、それはまだ古い画像です。何か案は?
2 に答える
4
ただし、正しく表示されるのは jdialog だけです。frame.validate(); を呼び出しても、元のフレームにはまだ古い画像が表示されます。frame.repaint();
イメージをメモリに読み取っても、コンポーネントは新しいイメージを参照しません。古いイメージを使用していたコンポーネントには、引き続き Icon を追加する必要があります。
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;
public class ImageReload extends JFrame implements ActionListener
{
JLabel timeLabel;
JLabel imageLabel;
ImageIcon icon = new ImageIcon("timeLabel.jpg");
public ImageReload()
{
timeLabel = new JLabel( new Date().toString() );
imageLabel = new JLabel( timeLabel.getText() );
getContentPane().add(timeLabel, BorderLayout.NORTH);
getContentPane().add(imageLabel, BorderLayout.SOUTH);
javax.swing.Timer timer = new javax.swing.Timer(1000, this);
timer.start();
}
public void actionPerformed(ActionEvent e)
{
timeLabel.setText( new Date().toString() );
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
String imageName = "timeLabel.jpg";
BufferedImage image = ScreenImage.createImage(timeLabel);
ScreenImage.writeImage(image, imageName);
// This works using ImageIO
// imageLabel.setIcon( new ImageIcon(ImageIO.read( new File(imageName) ) ) );
// Or you can flush the image
ImageIcon icon = new ImageIcon(imageName);
icon.getImage().flush();
imageLabel.setIcon( icon );
}
catch(Exception e)
{
System.out.println( e );
}
}
});
}
public static void main(String[] args)
{
ImageReload frame = new ImageReload();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}
}
于 2013-05-31T22:14:06.350 に答える