0

所以我的程序有多个类,在其中一个运行后,它会喜欢它,所以它会在主类 GUI 中的文本区域附加一条“完成”消息

ta.append("Search Complete\n");

这是需要完成的代码

statCl.addActionListener(new ActionListener(){
        public void actionPerformed (ActionEvent e) {
            try {
                ta.append("Searching...\n");
                task.execute();
            } catch (Exception IOE) {}
        }
});

所以它在task实际代码运行的类中。

任何建议或帮助都会很棒,谢谢。

4

2 回答 2

2

如果 task.execute() 方法没有开始在另一个线程中启动操作,那么 GUI 将被冻结,并且在操作完成之前文本区域中不会出现任何内容。所以你可能有

ta.append("Searching...\n");
task.execute();
ta.append("Finished");

如果操作是在新线程中启动的,那么这个线程应该追加到文本区域,但它应该确保这个追加是在事件调度线程 (EDT) 中完成的。因此,您的代码可能如下所示:

public class Task {
    private JTextArea ta;
    public Task(JTextArea ta) {
        this.ta = ta;
    }

    public void execute() {
        Thread t = new Thread(new Runnable() {
            // perform the long operation
            // at the end, update the text area, in the EDT
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    ta.append("finished");
                }
            });
        }
        t.start();
    }
}

你也可以看看SwingWorker,它就是为此而设计的(以及其他东西,比如进度更新)。它的类 javadoc 中有一个代码示例,它可以执行您正在尝试执行的操作。

于 2011-02-17T13:41:39.077 回答
0

您不应该在 EDT(事件调度线程)上执行长时间运行的任务:http: //java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Swing 在 EDT 上完成所有工作,因此您不应阻止 EDT,例如在其上运行密集任务。注意:所有事件处理程序都在 EDT 上执行。

所以有两个挑战:

  1. 在后台线程中运行密集任务。
  2. 更新 GUI,必须在 EDT 上完成。

使用SwingWorker来解决这两个问题。

于 2011-02-17T13:42:23.767 回答