我一直在尝试使用Swing Timer更新插入GUI的BufferedImage。 最初我使用BufferedImage创建ImageIcon,然后通过控制器实例将其添加到JLabel(字段)。然后在GUI上显示当前图像。 这里是GUI类中初始代码的代码片段。
strncpy
现在我每隔x秒尝试一次BufferedImage。 为此,我使用了Swing Timer类,但不幸的是我无法成功。 我使用ActionListener创建了以下类,因此每3秒使用getCameraImage方法检索一个新图像。
这里是带有ActionListener类的UpdateImage:
JLabel field;
ImageIcon icon;
BufferedImage image = this.controller.getCameraImage();
icon = new ImageIcon(image);
field= new JLabel (icon);
将BufferedImage设置为ImageIcon后,我使用getLabel方法检索它。 然后将此组件添加到GUI。
public class UpdateImage {
private JLabel label;
private Timer timer;
private Controller controller;
private int delay = 3000; // every 3 seconds
private ImageIcon icon;
private BufferedImage image;
public UpdateImage(Controller controller) throws Exception {
this.controller = controller;
ActionListener action = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
try {
System.out.println("image update");
label = new JLabel();
image = controller.getCameraImage();
label.setIcon(new ImageIcon(image));
} catch (CallError | InterruptedException e) {
e.printStackTrace();
}
}
};
timer = new Timer(delay, action);
timer.setInitialDelay(0);
timer.start();
}
public JLabel getLabel() {
return label;
}
}
字符串"图像更新"在控制台上每3秒显示一次。 但图像不会在GUI上显示。
如果有人能通过给我某种暗示或指出我做错了什么来帮助我,我真的很感激。
答案 0 :(得分:3)
使用具有相同文件名的ImageIcon时,将缓存图像。您需要强制重新加载图像:
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 JPanel implements ActionListener
{
JLabel timeLabel;
JLabel imageLabel;
ImageIcon icon = new ImageIcon("timeLabel.jpg");
public ImageReload()
{
setLayout( new BorderLayout() );
timeLabel = new JLabel( new Date().toString() );
imageLabel = new JLabel( timeLabel.getText() );
add(timeLabel, BorderLayout.NORTH);
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 );
*/
imageLabel.setText("");
}
catch(Exception e)
{
System.out.println( e );
}
}
});
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new ImageReload() );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
编辑:
您还需要Screen Image类来执行此代码。