java - 事件线程和主线程的代码结构
问题描述
我会很感激一些关于程序设计的建议。我有一个摆动 GUI,我通过以下方式从主要启动:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new GUI(generations);
}
});
但是,由于一些主处理需要一段时间,我想在主线程中进行大部分处理(或者可能是由主线程启动的单独处理?)。我需要创建一个 GUI 实例然后从 main 调用它的方法吗?
解决方案
您需要创建 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));
}
推荐阅读
- exception - Laravel Eloquent 更新失败,但没有得到任何异常
- javascript - 如何仅阻止未使用 chrome 扩展缓存的图像?
- codeigniter-3 - 如何解决aaray到字符串转换的错误
- python - 如何在Python列表中重复查找两个元素之间的所有元素?
- python - 如何使用 python 子进程命令在不同目录中运行 shell 命令?
- reactjs - 如何在 React Navigation 5 中使标签栏角透明?
- java - AssertJ 可以遍历 JSON API 响应来验证节点的路径吗?
- google-cloud-storage - 如果 mp3 计算文件类型 | 谷歌存储
- vue.js - 如何从 Nuxt 中的服务器中间件 API 访问在我的 nuxt 模块中定义的变量?
- swift4.2 - 无法向 AgoraRTM 频道发送消息