Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingUtilities.invokeLater、SwingWorker和gif图标动画问题_Java_User Interface_Animated Gif_Swingworker_Swingutilities - Fatal编程技术网

Java SwingUtilities.invokeLater、SwingWorker和gif图标动画问题

Java SwingUtilities.invokeLater、SwingWorker和gif图标动画问题,java,user-interface,animated-gif,swingworker,swingutilities,Java,User Interface,Animated Gif,Swingworker,Swingutilities,我试图加载一个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.JFram

我试图加载一个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();
                    }
                }
            });

        }
    });

}
}
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;
}
}
当用户单击“登录”按钮时,我更改了按钮的文本并在其上放置gif图标。在

SwingUtilities.invokeLater(新的Runnable(){

方法我通过SwingWorker线程启动后台昂贵任务。现在,不需要发布和处理SwingWorker类的方法,因为我在后台昂贵任务期间不做任何工作

如果我删除“SwingUtilities.invokeLater(new Runnable(){)”方法并直接调用SwingWorker类,那么gif和png图标都不起作用(显示在按钮上)

我试着用简单的线程来改变文本并在按钮上设置图标,但效果并不理想

下面是SwingWorker类代码

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();
                    }
                }
            });

        }
    });

}
}
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;
}
}
import javax.swing.JFrame;
导入javax.swing.SwingWorker;
公共类Worker扩展SwingWorker实现Runnable{
私有JFrame测试框架;
//一些公共和私人财产
公共工作者(JFrame){
//做一些作业
this.testFrame=frame;
}
@凌驾
受保护的void done(){
//TODO自动生成的方法存根
超级。完成();
System.out.println(“调用的完成方法”);
}
@凌驾
受保护的字符串doInBackground()引发异常{
int i=0;
字符串块=null;
发布(块);
//做一些非常昂贵的工作,HTTP请求,数据库操作等等。。。
而(i<10){
螺纹、睡眠(1000);
System.out.println(“i的值:+i”);
i++;
}
这个。完成();
testFrame.setVisible(false);
返回null;
}
}

你知道吗?GUI主线程中发生了什么?错误在哪里?

你不应该直接调用
doInBackground
,你应该调用
execute
。你还应该能够在UI线程中进行调用(即不需要在
调用器中调用它)。在您的
doInBackground
实现中,您应该在UI线程中对UI进行更改(即,
invokeLater
应该在那里使用)。

祝您好运:)