使用Swing Timer在GUI上更新BufferedImage

时间:2015-05-09 19:08:50

标签: java swing user-interface

我一直在尝试使用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上显示。

如果有人能通过给我某种暗示或指出我做错了什么来帮助我,我真的很感激。

1 个答案:

答案 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类来执行此代码。