1

我正在尝试让 SwingWorker 工作。我目前有以下代码:

public class ImageWorker extends SwingWorker<Void, Void> implements KeyListener
{   
private JLabel imageLabel;
private ImageIcon basicImage; 
private ImageIcon whiteImage;  
public static void main(String[] args)
{
    new ImageWorker();      
}

public ImageWorker()
{
    final JFrame frame = new JFrame();
    imageLabel = new JLabel();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.getContentPane().add(imageLabel);
    frame.setVisible(true);
    try
    {
        basicImage = new ImageIcon(ImageIO.read(new File("src\\img\\basis1.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
        whiteImage = new ImageIcon(ImageIO.read(new File("src\\img\\wit.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));       
    }
    catch(IOException ex)
    {
        ex.getMessage();
    }
    this.execute();

}

@Override
protected Void doInBackground() 
{
    try
    {
        while (true)
        {
            displayImage(basicImage);
            Thread.sleep(1000L);
            if(isCancelled())
                return null;
        }
    }
    catch(InterruptedException e)
    {
        e.getMessage();
    }
    return null;
}

private void displayImage(final Icon image)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            imageLabel.setIcon(image);
        }
    });     
}

我期待图像出现在 JLabel 中,但我只看到 JFrame 弹出。文件已正确加载我已经在另一个设置中进行了测试。任何指针?

4

2 回答 2

2

这是一个使用 aTimer而不是使用SwingWorkerwhich 确实不适合您的情况的示例。请注意,它与您现有的代码并没有太大的不同。

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class ImageWorker implements KeyListener
{
    private JLabel imageLabel;
    private ImageIcon basicImage;
    private ImageIcon whiteImage;
    private boolean isBasic =  true;
    private int delay = 1000; //milliseconds
    private Timer timer;

    public static void main(String[] args)
    {
        new ImageWorker();
    }

    public ImageWorker()
    {
        final JFrame frame = new JFrame();
        imageLabel = new JLabel();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.getContentPane().add(imageLabel);
        frame.setVisible(true);

        try
        {
            basicImage = new ImageIcon(ImageIO.read(new File("src\\img\\basis1.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
            whiteImage = new ImageIcon(ImageIO.read(new File("src\\img\\wit.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));       
        }
        catch (IOException ex)
        {
            ex.getMessage();
            ex.printStackTrace();
        }

        frame.addKeyListener(this);
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                if(isBasic) {
                    //display basic image
                    imageLabel.setIcon(basicImage);
                }
                else {
                    //display white image
                    imageLabel.setIcon(whiteImage);
                }

                //toggle the flag
                isBasic = !isBasic;
            }
        };
        //use a timer instead of SwingWorker
        timer = new Timer(delay, taskPerformer);
        timer.start();

    }



    @Override
    public void keyPressed(KeyEvent e)
    {
        //key pressed, we want to stop toggling so stop the timer
        timer.stop();
        //do whatever else you were doing to set the value for isCancelled();
    }

    @Override
    public void keyReleased(KeyEvent e)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e)
    {
        // TODO Auto-generated method stub

    }
}
于 2011-03-03T15:40:41.937 回答
1

ASwingWorker不适合您的情况,请查看Timerswing 包中的A。这是 API 的链接:http: //download.oracle.com/javase/6/docs/api/javax/swing/Timer.html

您让计时器运行并每秒更改一个图像,因为这是您需要的。

此外,每当您遇到异常时,至少打印出堆栈跟踪或消息。否则,您将不知道是否发生异常并被捕获。

于 2011-03-03T15:26:59.197 回答