问题标签 [event-dispatch-thread]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java Event-Dispatching Thread 解释
我最近开始学习和探索 Java 中 GUI 编程的基础知识。
编程了一段时间后,我只完成了后端工作或工作,因此我最接近用户界面的是命令控制台(我知道这很尴尬)。
我正在使用 Swing,据我所知,这意味着通过扩展我也在使用 AWT。
我的问题是基于这段代码:
我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件调度线程”这个术语。如果我错了,请纠正我,但据我所知;它与使用多个线程以及 Java Swing 如何解释这些线程有关。我还收集到,上面的代码用于确保所有线程在创建窗口之前都是“安全的”,因此 invokeLater?
我读过:
“您只能从事件调度线程调用对帧进行操作的方法”
并且只有在某些情况下,您才能从 main 方法调用对框架进行操作的方法。
有人可以向我解释一下事件调度线程到底是什么吗?
它与多个执行线程有何关系,以及从 main 方法调用这些线程是如何不安全的?还有为什么我们需要这个invokeLater?
我们不能像任何其他对象一样创建窗口吗?
我在研究中遇到了一些障碍,因为我没有掌握这些关系和想法。
附带说明一下,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,从而产生最好的计划。如果我深入了解某事是如何工作的,那么您可以有效地使用这些技巧和调整,而不是仅仅将它们复制回代码中,所以请不要害怕给我一些更深入的解释并拓宽我的知识。
谢谢你。
java - 如何每次使用带有延迟的while循环更新jLabel
它最终会在 jLabel 上显示最终数字,但不会增量更新数字。任何帮助
java - javax.swing.JFrame setText() 在一个循环中?+ 故意拖延?
我对 Java 非常陌生(只使用了大约一周),并且正在开发商店模拟器。基本上我只想立即完成基本的事情,比如在屏幕上显示一个关闭前的时间和打开后的一段时间。
我在我的 Simulation extends javax.swing.JFrame 类中做了以下函数:
使用 setText() 方法的 openTime 和 timeLeft 变量是 GUI 本身的一部分。
主要是这样调用incOpenTime:
首先,当我运行它时,它基本上只是通过循环并仅在最后一次输出到屏幕。我将如何做到这一点,使时代不断变化?
其次,我想稍微延迟一下……也许每秒大约 1 毫秒,这样模拟运行速度会更慢,并且输出到屏幕(稍后)的其他数据更具可读性。我试过 Thread.sleep(1); 在循环中,但在更改时不显示数字。
请帮忙。
谢谢
编辑:
这是我为使其正常工作所做的工作。主要:
新建了一个类:
java - 多个事件调度线程
我是 Java Swing 的新手,我的问题与事件队列和调度线程有关。
我读到可以有多个事件队列,每个AppContext实例。同样是不是意味着每个 AppContext 事件队列都有自己的事件调度线程。
java - 摆动调用者冻结
我使用以下代码从 actionPerformed 上的按钮直接调用 invokeLater:
这仍然会冻结 GUI。为什么?不使用invokelater函数我得到相同的结果。
我应该使用
反而?
编辑:
谢谢,应该使用新线程。
java - AWT EventQqueue AccessControlException
我正在将我自己的测试事件队列推送到系统事件队列上。在 TestEQueue 中,我通过一次调用 super.dispatchEvent 来重载 dispatchEvent 方法
但是由于某种原因,在新的 TestQueue 中调度失败并出现 AccessControlException。在没有 TestEQueue 的情况下,在主程序中成功调度了相同的事件。
这怎么可能,因为两个队列都将在同一个线程组中运行?我该如何调试这个问题?这是一个非常大的测试代码库的一部分,所以我无法复制功能代码。这可能与安全管理器有关吗?
java - 在多任务应用程序中管理 GUI 和 EDT
我开发了一个用于创建和提取档案的 Java 应用程序,例如WinRAR。您可以使用多线程同时创建多个存档。最近,我想在每次创建时在新的 JFrame 中以 JProgressBar 的形式在归档创建期间添加信息状态。
但我的问题是在新的状态框架和创建档案的线程中生成信息。这就是我在存档线程中创建 JFrame 以更新当前进度条的原因。
但是就像我可以在不同的信息源和您的答案/评论中阅读它一样,它不利于 Java Swing和性能;我无法在EDT的其他地方创建摇摆对象。
但是,我应该如何解决我的问题?我怎样才能在我的归档文件的写入和它的状态 JFrame(使用 JProgressBar)之间建立通信?
编辑:
我实现了 SwingWorker 来管理我的应用程序中的 GUI。现在已经完成了,我还有一个问题:
使用 SwingWorker,我如何通过状态框架按钮上的事件来处理后台任务?(例如:暂停压缩或停止压缩。)
java - 如何打开 AWT 的日志记录
我有一个性能问题,使鼠标事件以一种奇怪的方式堆积起来。我的分析工具说 AWT 线程一直很忙。我想知道是否有一些聪明的方法(例如在属性文件中设置一些值或其他东西)使 AWT 线程吐出有关它正在做什么的详细日志消息。
java - 从外部向位于 EventDispath 线程中的 JFrame 添加其他面板?
我在 EventDispatch 线程中创建了一个新框架,并希望稍后将新面板添加到该框架中。但我得到的只是一个空白框架,高度为 0。但是会显示从内部类内部添加的面板。如何使用 showFirstFrame() 添加?遇到此问题后,我不得不遵循这样的方法:在 Java 中调用 wait() 时,所有 Swing 框架都会“冻结”
我一直在参考本教程: http: //leepoint.net/JavaBasics/gui/gui-commentary/guicom-main-thread.html
提前致谢。
编辑:
java - 仅在 Event-Dispatch 线程中显示最后添加到 JFrame 的 JPanel
我只能看到最后添加的JPanel。以前的似乎被最后一个取代了。为什么是这样?这是我的代码。提前致谢。
编辑:(解决方案)
循环更改如下: