swingutilities.invokelater,Swingworker和GIF图标动画问题



我正在尝试加载gif图标,而我在后台做一些昂贵的工作。但是问题是,GIF(动画)图标没有加载。

如果我用PNG替换GIF图标,则可以正常工作。

这是测试类代码

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    JFrame frame = new JFrame();
    frame.setBounds(100, 100, 200, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    frame.getContentPane().add(panel);
    JButton loginButton = new JButton("Login");
    panel.add(loginButton);
    frame.add(panel);
    frame.setVisible(true);
    loginButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            URL urlProcessing = Test.class.getResource("processing.gif");
            //URL urlProcessing = Test.class.getResource("processing.png");
            ImageIcon processingIcon = new ImageIcon(urlProcessing);
            loginButton.setText("Authenticating...");
            loginButton.setIcon(processingIcon);
            loginButton.revalidate();
            loginButton.repaint();

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {     
                    Worker worker = new Worker(frame);
                    try {
                        worker.doInBackground();                            
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            });
        }
    });
}
}

当用户单击登录按钮时,我更改按钮的文本,然后在其中添加gif图标。在

swingutilities.invokelater(new runnable(){

方法我通过Swingworker线程开始背景昂贵的任务。目前,不需要发布和处理Swingworker类的方法,因为我在背景昂贵的任务中没有做任何工作。

如果我删除" swingutilities.invokelater(new runnable(){"方法并直接调用swingworker类,则gif和png图标均无法正常工作(显示在按钮上)。

我尝试了简单的线程更改文本并将图标设置在按钮上,但它也没有起作用。

这是Swingworker类代码

import javax.swing.JFrame;
import javax.swing.SwingWorker;
public class Worker extends SwingWorker<String, String> implements Runnable {
private JFrame testFrame;
// some public and private properties
public Worker(JFrame frame){
    // doing some assignments
    this.testFrame = frame;
}
@Override
protected void done() {
    // TODO Auto-generated method stub
    super.done();
    System.out.println("Done method called");
}

@Override
protected String doInBackground() throws Exception {
    int i = 0;
    String chunks = null;
    publish(chunks);
    // Doing some very expensive work, HTTP request, DB operations etc...
    while (i < 10) {
        Thread.sleep(1000);
        System.out.println("Value of i: "+i);
        i++;
    }
    this.done();
    testFrame.setVisible(false);
    return null;
}
}

有什么想法吗?GUI主线程中发生了什么?错误在哪里?

您不应该直接调用doInBackground,而应致电execute。另外,您应该能够在UI线程中进行该调用(即无需在invokeLater中调用它)。在您的doInBackground实现中,您应该在UI线程中对UI进行更改(即应使用invokeLater)。

最新更新