首页 > 解决方案 > 事件线程和主线程的代码结构

问题描述

我会很感激一些关于程序设计的建议。我有一个摆动 GUI,我通过以下方式从主要启动:

SwingUtilities.invokeLater(new Runnable(){
    public void run(){
        new GUI(generations);
    }
});

但是,由于一些主处理需要一段时间,我想在主线程中进行大部分处理(或者可能是由主线程启动的单独处理?)。我需要创建一个 GUI 实例然后从 main 调用它的方法吗?

标签: javamultithreadingswingevent-dispatch-thread

解决方案


您需要创建 GUI 的初始状态 - 与您现在所做的相同,使用空的可视元素,然后在主线程上计算它们的内容,然后以相同的方式将更新发送到可视元素invokeLater()

一个问题是如何从主线程访问 GUI 元素。可能的解决方案如下:

class GUI extends JFrame {
    JTextArea jlist = new JTextArea();

    public GUI(CompletableFuture<GUI> result) {
        this.add(jlist, null);
        result.complete(this);
    }

    public void print(String m) {
        jlist.append(m);
    }

}

public static void main (String[]args) throws Exception {
    CompletableFuture<GUI> result = new CompletableFuture();
    EventQueue.invokeLater(() -> new GUI(result));
    GUI gui = result.get();
    // compute something
    long time = System.currentTimeMillis();
    // pass computed value to GUI
    EventQueue.invokeLater(() -> gui.print("time="+time));
}

推荐阅读