gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:30:56 24 4
gpt4 key购买 nike

我正在尝试加载 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)。

关于java - SwingUtilities.invokeLater、SwingWorker 和 gif 图标动画问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46147760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com