我创建了一个简单的JAVA Swing程序,它有一个JTextArea,三个JTextField和一个JButton。此应用程序的作用是当用户单击按钮时,它使用文本行更新JTextArea,插入JTextArea的文本行在for循环中准备,重复次数在JTextField中给出。
我的问题是当我点击启动JButton应用程序的所有组件都冻结时,我甚至无法关闭窗口,直到for循环完成它的工作。如何将此JTextField更新工作与表单中的其他任务分开?
答案 0 :(得分:9)
您可能正在对事件调度线程(与GUI渲染完成相同的线程)进行工作。使用SwingWorker
它将在另一个线程中完成工作。
以下代码生成此屏幕截图:
示例工作者:
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);
}