Java从不同的类更改GUI

时间:2011-02-17 13:19:35

标签: java class actionlistener

所以我的程序有多个类,并且在其中一个类运行后,它会喜欢它,所以它在主类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类中。

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

2 个答案:

答案 0 :(得分: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中有一个代码示例,它可以完成您正在尝试的任务。

答案 1 :(得分:0)

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

Swing在EDT上完成所有工作,所以你不应该阻止EDT,例如:在它上面执行密集型任务。注意:所有事件处理程序都在EDT上执行。

所以有两个挑战:

  1. 在后台线程中运行密集型任务。
  2. 更新GUI,必须在EDT上完成。
  3. 使用SwingWorker来解决这两个问题。