gpt4 book ai didi

java - Swing 组件卡住,直到一个组件完成其工作

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:45 24 4
gpt4 key购买 nike

我创建了一个简单的 JAVA Swing 程序,它有一个 JTextArea、三个 JTextFields 和一个 JButton。该应用程序所做的是,当用户单击按钮时,它会用文本行更新 JTextArea,插入 JTextArea 的文本行在 for 循环中准备好,重复次数在 JTextField 中给出。

我的问题是,当我单击启动 JButton 时,应用程序的所有组件都被卡住,我什至无法关闭窗口,直到 for 循环完成它的工作。如何将此 JTextField 更新工作与表单中的其他任务分开?

最佳答案

您可能正在事件调度线程(完成 GUI 渲染的同一线程)上进行工作。使用 SwingWorker它将在另一个线程中完成工作。


例子

下面的代码产生了这个截图:

screenshot

示例 worker :

static class MyWorker extends SwingWorker<String, String> {

private final JTextArea area;

MyWorker(JTextArea area) {
this.area = area;
}

@Override
public String doInBackground() {
for (int i = 0; i < 100; i++) {
try { Thread.sleep(10); } catch (InterruptedException e) {}
publish("Processing... " + i);
}
return "Done";
}
@Override
protected void process(List<String> chunks) {
for (String c : chunks) area.insert(c + "\n", 0);
}
@Override
protected void done() {
try {
area.insert(get() + "\n", 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}

main 示例:

public static void main(String[] args) throws Exception {

final JTextArea area = new JTextArea();

JFrame frame = new JFrame("Test");

frame.add(new JButton(new AbstractAction("Execute") {
@Override
public void actionPerformed(ActionEvent e) {
new MyWorker(area).execute();
}
}), BorderLayout.NORTH);

frame.add(area, BorderLayout.CENTER);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}

关于java - Swing 组件卡住,直到一个组件完成其工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7524800/

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