Java从不同类更改GUI

Java从不同类更改GUI,java,class,actionlistener,Java,Class,Actionlistener,因此,我的程序有多个类,在其中一个类运行后,它希望在主类GUI中的文本区域附加一条“完成”消息 ta.append("Search Complete\n"); 这是需要完成的代码 statCl.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e) { try { ta.append("Searching...\

因此,我的程序有多个类,在其中一个类运行后,它希望在主类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

任何建议或帮助都会令人惊讶,谢谢。

如果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();
    }
}

您还可以查看,它就是为此而设计的(以及其他类似于进度更新的东西)。在它的类javadoc中有一个代码示例,它正是您试图做的事情。

您不应该在EDT(事件调度线程)上执行长时间运行的任务:

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

因此,有两个挑战:

  • 在后台线程中运行密集型任务
  • 必须在EDT上更新GUI

  • 用它来解决这两个问题。

    哦,我试着公开“ta”的原始声明,但这不起作用。声明的task.execute()异步?我完全不知道它是否是世界上最伟大的程序员。task类确实使用了SwingWorker,因为这里有人向我推荐过它,所以我得到了这个部分。我现在将尝试实现这一部分,干杯。