问题标签 [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.

0 投票
2 回答
37892 浏览

java - Java Event-Dispatching Thread 解释

我最近开始学习和探索 Java 中 GUI 编程的基础知识。

编程了一段时间后,我只完成了后端工作或工作,因此我最接近用户界面的是命令控制台(我知道这很尴尬)。

我正在使用 Swing,据我所知,这意味着通过扩展我也在使用 AWT。

我的问题是基于这段代码:

我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件调度线程”这个术语。如果我错了,请纠正我,但据我所知;它与使用多个线程以及 Java Swing 如何解释这些线程有关。我还收集到,上面的代码用于确保所有线程在创建窗口之前都是“安全的”,因此 invokeLater?

我读过:

“您只能从事件调度线程调用对帧进行操作的方法”

并且只有在某些情况下,您才能从 main 方法调用对框架进行操作的方法。

有人可以向我解释一下事件调度线程到底是什么吗?

它与多个执行线程有何关系,以及从 main 方法调用这些线程是如何不安全的?还有为什么我们需要这个invokeLater?

我们不能像任何其他对象一样创建窗口吗?

我在研究中遇到了一些障碍,因为我没有掌握这些关系和想法。

附带说明一下,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,从而产生最好的计划。如果我深入了解某事是如何工作的,那么您可以有效地使用这些技巧和调整,而不是仅仅将它们复制回代码中,所以请不要害怕给我一些更深入的解释并拓宽我的知识。

谢谢你。

0 投票
2 回答
8002 浏览

java - 如何每次使用带有延迟的while循环更新jLabel

它最终会在 jLabel 上显示最终数字,但不会增量更新数字。任何帮助

0 投票
3 回答
956 浏览

java - javax.swing.JFrame setText() 在一个循环中?+ 故意拖延?

我对 Java 非常陌生(只使用了大约一周),并且正在开发商店模拟器。基本上我只想立即完成基本的事情,比如在屏幕上显示一个关闭前的时间和打开后的一段时间。

我在我的 Simulation extends javax.swing.JFrame 类中做了以下函数:

使用 setText() 方法的 openTime 和 timeLeft 变量是 GUI 本身的一部分。

主要是这样调用incOpenTime:

首先,当我运行它时,它基本上只是通过循环并仅在最后一次输出到屏幕。我将如何做到这一点,使时代不断变化?

其次,我想稍微延迟一下……也许每秒大约 1 毫秒,这样模拟运行速度会更慢,并且输出到屏幕(稍后)的其他数据更具可读性。我试过 Thread.sleep(1); 在循环中,但在更改时不显示数字。

请帮忙。

谢谢

编辑:

这是我为使其正常工作所做的工作。主要:

新建了一个类:

0 投票
2 回答
1593 浏览

java - 多个事件调度线程

我是 Java Swing 的新手,我的问题与事件队列和调度线程有关。

我读到可以有多个事件队列,每个AppContext实例。同样是不是意味着每个 AppContext 事件队列都有自己的事件调度线程。

0 投票
1 回答
956 浏览

java - 摆动调用者冻结

我使用以下代码从 actionPerformed 上的按钮直接调用 invokeLater:

这仍然会冻结 GUI。为什么?不使用invokelater函数我得到相同的结果。

我应该使用

反而?

编辑:

谢谢,应该使用新线程。

0 投票
2 回答
200 浏览

java - AWT EventQqueue AccessControlException

我正在将我自己的测试事件队列推送到系统事件队列上。在 TestEQueue 中,我通过一次调用 super.dispatchEvent 来重载 dispatchEvent 方法

但是由于某种原因,在新的 TestQueue 中调度失败并出现 AccessControlException。在没有 TestEQueue 的情况下,在主程序中成功调度了相同的事件。

这怎么可能,因为两个队列都将在同一个线程组中运行?我该如何调试这个问题?这是一个非常大的测试代码库的一部分,所以我无法复制功能代码。这可能与安全管理器有关吗?

0 投票
3 回答
1298 浏览

java - 在多任务应用程序中管理 GUI 和 EDT

我开发了一个用于创建和提取档案的 Java 应用程序,例如WinRAR。您可以使用多线程同时创建多个存档。最近,我想在每次创建时在新的 JFrame 中以 JProgressBar 的形式在归档创建期间添加信息状态。

但我的问题是在新的状态框架和创建档案的线程中生成信息。这就是我在存档线程中创建 JFrame 以更新当前进度条的原因。

但是就像我可以在不同的信息源和您的答案/评论中阅读它一样,它不利于 Java Swing和性能;我无法在EDT的其他地方创建摇摆对象。

但是,我应该如何解决我的问题?我怎样才能在我的归档文件的写入和它的状态 JFrame(使用 JProgressBar)之间建立通信?


编辑:

我实现了 SwingWorker 来管理我的应用程序中的 GUI。现在已经完成了,我还有一个问题:

使用 SwingWorker,我如何通过状态框架按钮上的事件来处理后台任务?(例如:暂停压缩或停止压缩。)

0 投票
2 回答
352 浏览

java - 如何打开 AWT 的日志记录

我有一个性能问题,使鼠标事件以一种奇怪的方式堆积起来。我的分析工具说 AWT 线程一直很忙。我想知道是否有一些聪明的方法(例如在属性文件中设置一些值或其他东西)使 AWT 线程吐出有关它正在做什么的详细日志消息。

0 投票
2 回答
388 浏览

java - 从外部向位于 EventDispath 线程中的 JFrame 添加其他面板?

我在 EventDispatch 线程中创建了一个新框架,并希望稍后将新面板添加到该框架中。但我得到的只是一个空白框架,高度为 0。但是会显示从内部类内部添加的面板。如何使用 showFirstFrame() 添加?遇到此问题后,我不得不遵循这样的方法:在 Java 中调用 wait() 时,所有 Swing 框架都会“冻结”

我一直在参考本教程: http: //leepoint.net/JavaBasics/gui/gui-commentary/guicom-main-thread.html

提前致谢。

编辑:

0 投票
1 回答
196 浏览

java - 仅在 Event-Dispatch 线程中显示最后添加到 JFrame 的 JPanel

我只能看到最后添加的JPanel。以前的似乎被最后一个取代了。为什么是这样?这是我的代码。提前致谢。

编辑:(解决方案)

循环更改如下: