摆动组件冻结,直到一个组件完成其工作

Har*_*sha 4 java concurrency swing swingworker

我创建了一个简单的JAVA Swing程序,它有一个JTextArea,三个JTextField和一个JButton.此应用程序的作用是当用户单击按钮时,它使用文本行更新JTextArea,插入到JTextArea中的文本行在for循环中准备,重复次数在JTextField中给出.

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

dac*_*cwe 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例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);
}
Run Code Online (Sandbox Code Playgroud)

  • *"你能给我一个例子......?"*我可以给[100](http://stackoverflow.com/search?q=SwingWorker+).我认为在500多个点击中必须有100个例子(除了答案中已经链接的例子). (3认同)