问题标签 [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 - 如何解决在 Swing JPanel 中显示倒数计时器(JLabel)的延迟
我已经实现了一个倒数计时器(在函数中),它每秒更新一次摆动面板中的标签这是代码:
现在我的问题出在我的代码的另一部分,当我想要做以下事情时:
所以问题是当我想开始游戏时,我正在定义我的计时器并分配它,给它启动命令并转到我应该在那里看到计时器(JLabel
更新)的屏幕。
尽管它应该已经在计数(甚至在显示计时器的屏幕之前),但我仍然有延迟:我得到了显示计时器的面板,大约两秒钟后Jlabel
出现并开始倒计时。
我认为这是因为在Jlabel
我做的时候事件调度线程没有立即更新Jlabel.setText()
关于如何立即开始游戏而不延迟显示的任何建议Jlabel
?
谢谢
java - 不合规 JVM 不发送 WindowClosing 事件的解决方法
各种 OS X 版本上的 Apple JVM 显然已被破坏,因为它们不会在应该生成 WindowClosing 事件时(例如,如果您通过单击关闭按钮关闭应用程序的主 JFrame)。
(在最近的 Apple Java 更新中,您可以设置一个属性来强制生成事件,但这不是我想要的)
我的问题很简单:我想在用户关闭应用程序时显示“提示”。但是我不能(由于没有生成事件)检测到用户关闭了窗口。
所以我想我可以使用关闭钩子:
然而,显然从关闭挂钩创建 JFrame 似乎有问题:就像一旦调用关闭挂钩,EDT 就已经消失了。
我尝试了几件事,但似乎没有什么真正有意义:就像我的“提示”JFrame 保持灰色(尽管从任何地方调用它时它工作正常,但关闭挂钩)或程序立即退出。我尝试使用闩锁并等待关闭挂钩的闩锁,但就好像 EDT 不再存在一样。
我目前正在认真考虑生成第二个 Java 应用程序只是为了将工具提示显示为一种解决方法,但我认为这有点矫枉过正(但至少它会起作用)。
有没有人尝试过从关闭挂钩创建一个窗口并在 EDT 上调用一些东西,并且有什么需要注意的问题吗?(请记住,由于已知的长期存在的 Apple VM 错误,我无法可靠地捕获 OS X 上的窗口关闭事件)。
java - 了解 Java Event Dispatch Thread 中引发的代码范围
我试图了解哪些事件将通过事件调度线程 (EDT) 进行管理。
让我们假设一些简单的事情,一段简单的代码打开一个 JOptionPane,等待用户的响应,然后关闭它。与此对象相关的哪些事件现在放在 EDT 上?是不是:a)只是对象(JOptionPane)的创建。b) 对象生命周期内的所有对象相关事件。C) 其他东西(请说明)。
谢谢,
艾略特
见下文:
java - 从 doInBackground 在 EDT 上运行函数
我想在 EDT 上从 doInBackground 运行某个函数。我目前使用发布和进程设置它,它工作得很好。但是,我想知道是否有一种方法可以在不使用发布和处理的情况下从 doInBackground 在 EDT 上运行函数。此外,不使用 invokeLater。我能以某种方式做到这一点吗?
java - Eclipse/Java:EDT 上未捕获的异常在 EventDispatchThread.run() 中暂停执行
这是我在使用 Eclipse 进行调试时遇到的一个小烦恼。选中“暂停执行未捕获的异常”后,调试器通常会在引发异常的地方暂停线程。然而,事件调度线程的异常会导致它在 EventDispatchThread.run() 的最后一行暂停。在我恢复线程以允许堆栈跟踪打印到控制台之前,没有关于异常是什么或导致它的原因的有用信息。
在Eclipse中调试以下代码进行演示:
这是抛出异常后的样子:
编辑 2011 年 10 月 21 日:我想 Eclipse 或 Java 调试器没有什么奇怪的,只是在 EventDispatchThread.pumpOneEventForFilters(int) 中捕获并重新抛出异常。我想没有办法告诉 Eclipse“暂停执行将被捕获并可能重新抛出的异常”。太糟糕了。
java - 我怎么知道我是否在事件调度线程上?
1.考虑我的代码在我拥有的 JPanel 的某行上,我是否自动在 EDT 上?
2.对于不属于 GUI、JPanels 或其他视图类、简单逻辑类的所有其他类,同样的问题。
3.如果我有JPanel,我正在播放音乐,音乐应该在事件调度线程或其他不是EDT的线程上运行(因为不阻塞GUI,虽然我觉得运行没有任何问题它来自美国东部时间)?
注意:我想要一个通用规则,如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下知道它
java - 动画线程和 EDT
正如我在上一篇文章中与 Inerdia 讨论的那样,
当我在某个 JPanel 中(EDT 肯定——我检查了方法检查)然后我调用了一些动画线程(线程扩展线程)来启动时,有些东西仍然很奇怪。通过检查我不在 EDT 上的线程。
所以我想我应该是因为动画应该在 EDT 上,所以我用 runnable 和 invokeAndWait() 包装了 animate 方法,但仍然在我不在 EDT 上的动画线程中得到了它,同时调用了我之前说的那个代码在 EDT 上,所以,我的 invokeLater 似乎没有将该动画放在 EDT 上?这是为什么?
相关代码(在使用 runnable 包装 animate 方法并稍后传递给调用之前:
因此,在 JPanel 上有一行:
实现是:
java - 你如何使用事件调度线程?
我了解了 swing 不是线程安全的。深入研究后,我发现对 Swing 组件的每次修改都必须在 Event Dispatch Thread 上完成,以防止与多线程相关的各种问题。然而,信息似乎完全停在那里。似乎没有一个很好的教程来解释如何在互联网上任何可访问的地方执行此操作。
将发布的与其他问题相关的代码中的信息拼凑在一起,似乎我必须在我的程序中的每一个摆动修改周围放置一个不整洁的代码块(就像我自己的代码中的这个示例):
基本上,这是对的吗?我是否必须在代码中对 Swing 组件的每次修改都放置该代码(或与 invokeLater 等效的代码)?
另外,为什么 Swing 不自动执行此操作?
java - 打开 JFileChooser 时出现 IOException
好吧,这真的很奇怪。每次我的应用程序第一次打开 JFileChooser 时,它都会引发 IOException,然后某些图标无法正确显示。
现在,当我深入研究错误时,似乎在一个图标上尝试读取标题时,它只检索前 8 个字节,这还不够。我已经检查了图标文件,它们看起来都很好。我试图用另一个在此错误之前正确加载但相同的图标文件覆盖图标文件。
这是我遇到此错误时的堆栈:
这是我在挖掘 GifImageDecoder 实例时的变量值。
通常,这个图像数据应该更大。如您所见,前 10 个字节是标头,但它只检索 8 个字节。在此异常之后,来自 JFileChooser 的所有其他图标都无法正确加载。
这是对 readHeader() 的正确调用:
缓冲区在引发错误的图标之前完全加载了一个图标。
这是它可能崩溃的一个例子(它发生在我的代码的几个部分,每当我第一次加载我的系统图标时):
当它进入超级(文件)时,它会去那里:
然后上面提到的其他线程检索图标(参见这篇文章的第二个堆栈)
java - SwingWorker process() GUI 更新困难与合并块
对不起,有点长,但它有点涉及......
SwingWorker 在我的应用程序中完全按预期工作,除了我正在努力解决的一个棘手问题,如果块到达 process() 合并,正如 API 明确指出的那样,这是完全可能且正常的。
问题来了,例如,当我有一个 JDialog,它首先说“任务发生,请稍候”:所以发布了一个块doInBackground()
,然后到达process()
并设置一个 JDialog。
当 doInBackground 中的冗长任务完成后,我“发布”另外 2 个命令:一个说“将 JDialog 的消息更改为“等待 GUI 更新””,另一个说“用我发送的结果填充 JTable你”。
关于这一点的要点是,如果您要向 JTable 发送大量新数据来替换其 TableModel 的向量,Swing 实际上可以花费不可忽略的时间来更新自身......因此我想告诉用户: “冗长的任务已经完成,但我们现在正在等待 Swing 更新 GUI”。
奇怪的是,如果这两条指令作为 2 个合并的块到达,我发现 JDialog 只能部分更新: setTitle("blab") 导致 JDialog 的标题被更改......但是对 JDialog 的所有其他更改被搁置……直到 JTable 的主要 GUI 更新完成。
如果我设计了一些东西,以便在发布块之间 doInBackground 有一点延迟,那么 JDialog 更新就可以了。显然,对于合并的块,我正在使用一个循环来逐个遍历它们,所以我想在每个循环的末尾放置一个 Timer。这没有效果。
我还在 JDialog 上尝试了无数的“验证”、“绘制”和“重绘”排列。
因此,问题是:如何让 GUI 在处理合并块的迭代之间在 process() 内更新自身。
注意我还尝试了其他方法:如果它们是多个,则重新发布块。这样做的问题是,鉴于事物的异步性质,它可能导致以错误的顺序发布块,就像在 doInBackground 中一样,不可避免地,事物会继续发布。另外,这种解决方案并不优雅。
稍后...根据要求,这是一个 SSCCE:
...该程序由 5 个阶段组成:1) 设置 GUI 2) 发出一条消息说“等待任务完成” 3) “冗长的”非 EDT 任务 4) 更改消息以便它现在说“等待 GUI 更新表格” 5)在 GUI 中更新表格(随后处理 JDialog/JOptionPane)。
我不明白的是为什么,如果您注释掉上面 doInBackground 中的 Thread.sleep() 行,JDialog 的行为会很奇怪:然后更新了标题,但 JOptionPane 的文本没有改变,并且“取消" 按钮不会被移除。
可以看出,不同之处在于没有 Thread.sleep() 行,两个块到达合并,并在 EDT 中一个接一个地执行......我尝试过在结束时运行一个短 Timer 之类的东西“块处理循环”,并尝试使用 Thread.yield() ......基本上我试图强制 GUI 全面更新 JDialog 及其所有组件......在继续更新 JTable 之前......
任何想法表示赞赏。