gpt4 book ai didi

即使使用 SwingWorker,Java GUI 也会卡住

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:15:02 25 4
gpt4 key购买 nike

我正在尝试使用 SwingWorker 执行冗长的任务并使用结果更新 JLabel:

button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<String, Void>() {

@Override
protected String doInBackground() throws Exception {
return doCalculation();
}

protected void done() {
try {
label.setText(get());
} catch (InterruptedException e) {
System.out.println("thread was interrupted");
} catch (ExecutionException e) {
System.out.println("there was an ExecutionException");
}
}

}.execute();

}

});

我可以根据需要多次单击按钮,并且 Gui 将保持响应,直到两个线程完成,此时 Gui 在线程运行时卡住。如果我一次只运行一个线程,仍然会出现此问题。

如果有人能指出我是否错误地使用了 SwingWorker 或者是否还有其他我不知道的问题,我将不胜感激。谢谢你的时间。伊恩

编辑

doCalculation() 只是一些耗时的东西:

private String doCalculation() {
for (int i = 0; i < 10000000; i++) {
Math.pow(3.14, i);
}
return threads++ + "";
}

最佳答案

抱歉,即使使用您的 doCalculate() 方法,我仍然无法重现您的问题。例如这里是我的 sscce :

import java.awt.event.*;
import java.util.concurrent.ExecutionException;
import javax.swing.*;

public class FooGui {
private static int threads = 0;

private static void createAndShowUI() {
final JLabel label = new JLabel(" ");
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<String, Void>() {

@Override
protected String doInBackground() throws Exception {
return doCalculation();
}

@Override
protected void done() {
try {
label.setText(get());
} catch (InterruptedException e) {
System.out.println("thread was interrupted");
} catch (ExecutionException e) {
System.out.println("there was an ExecutionException");
}
}
}.execute();
}
});
JPanel panel = new JPanel();
panel.add(button);
panel.add(label);

JFrame frame = new JFrame("FooGui");
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private static String doCalculation() {
for (int i = 0; i < 5000000; i++) {
Math.pow(3.14, i);
}
return threads++ + "";
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
createAndShowUI();
}
});
}
}

您可能希望创建并发布 "Short, Self Contained, Correct (Compilable), Example" or SSCCE你自己的(请检查链接)。我敢打赌,在创建它的过程中,您可能会自己找到问题及其解决方案。如果是这样,请务必回到这里告诉我们。

我知道这不是一个真正的答案,但没有办法在评论中发布这样的代码。

关于即使使用 SwingWorker,Java GUI 也会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883873/

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