问题标签 [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 投票
1 回答
207 浏览

java - 在 MATLAB 中为 Swing 控件启用“非线程安全”警告

默认情况下,在 MATLAB 中禁用 Swing “非线程安全”警告。有谁知道这个警告的标识符是什么,以便我可以在 MATLAB 中启用它?

Yair Altman几年前发布过它,但我再也找不到它了。另见http://www.mathworks.ch/matlabcentral/newsreader/view_thread/129919

这个链接是关于线程安全和为什么它很重要http ://undocumentedmatlab.com/blog/matlab-and-the-event-dispatch-thread-edt/

0 投票
5 回答
68223 浏览

java - SwingUtilities.invokeLater 做什么?

做什么SwingUtilities.invokeLater?它只是延迟其run方法内的代码块的执行吗?invokeLater在函数内调用一个动作或在我们想要执行的线程结束时简单地调用它有什么区别?任何人都可以帮助我了解该功能的真正invokeLater作用吗?

0 投票
6 回答
11174 浏览

java - 为什么我的 JTextArea 没有更新?

我的代码如下:

但是,当调用 setText 时,它不会在每次循环迭代后更新文本区域,而是仅在任务的所有运行完成后才更新文本。为什么会发生这种情况,我该如何解决?

0 投票
6 回答
4778 浏览

java - 后台作业运行而不影响 gui 的其余部分

我正在寻求有关一般方法的帮助。

我已经编写了一些 java 代码来检查我的邮箱是否有按钮单击上的未读邮件。

现在我希望这段代码在后台永久运行,每 2 分钟检查一次我的邮箱。

馊主意:

图形界面的其余部分显然冻结了,所以我想线程必须发生一些魔法。

这怎么可能实现?

0 投票
3 回答
7067 浏览

java - 检测到 JVM 正在关闭

我有一个使用 addShutdownHook() 处理 Ctrl+C 的 Swing 应用程序,它可以正常工作,直到我有一个关闭任务调用一个函数,该函数在正常情况下会更改 JLabel 文本,此时它会挂起。

我认为问题在于 Swing EDT 要么已终止,要么正在等待某事。

有没有办法确定 EDT 已经终止或“完成”(这样我可以避免调用 Swing 方法),或者阻止 Ctrl-C 上通常的关闭所有窗口的行为?


只是为了澄清:

我在一个名为stop(). 在正常情况下,这可以被调用(连同它的补码start()),它会触发一系列导致 JLabel 更新的事情,以获得 astop()已经发生的视觉反馈。

当我的关闭挂钩运行时,我需要调用stop()以优雅地关闭一些资源。

我要问的是如何检测到 Swing EDT 不存在,所以我可以重写stop()以便它检测到缺少 Swing 并避免调用 Swing 函数。

0 投票
2 回答
1318 浏览

java - Java Swing EDT 和并发

我只是想知道是否仍然需要确保 invokeLater() Runnable 中的同步性。

我遇到了死锁,需要在保持并发性的同时克服它。

这会是好代码的一个例子吗?:

抱歉这个相当糟糕的例子,但我们必须假设它text正在被不同的线程修改,不能被注入,并且依赖于正确的值。

这是正确的解决方案还是我会通过将同步代码发送到未知上下文中无意中造成死锁问题..?

谢谢。

0 投票
1 回答
560 浏览

java - 在昂贵的操作之前强制 JLabel 显示文本

JLabel使用ImageIcon.

我有一个固定大小的 JLabel,它将显示完美适合它的文本或图像。我试图让它显示文本“正在加载...”,然后立即让它从 URL 加载图像并用它替换文本。

(假设异常被正确捕获并进行了所有必需的导入,并且图像存在且有效。)

上面的代码不显示文字;所发生的只是应用程序挂起,因为图像在几分之一秒后被下载并显示,大部分与预期的一样。在继续用图像替换它之前,如何强制摇摆更新 JLabel?或者,您知道实现这一目标的另一种更有效的方法吗?

0 投票
4 回答
5970 浏览

java - 如何在 Swing 加载构建 GUI 时更新/绘制 JProgressBar

我有一个 GUI,在它运行的平台上构建/初始化非常繁重..因此我想在它初始化时更新进度..

我有一个未装饰的小型 JDialog,其中包含一个 JLabel 和一个 JProgressBar,我想在初始化期间在特定位置进行更新,但是,因为事件调度 thead(根据 Swing 规则)用于构建/初始化 GUI,所以进度当然是直到 EDT 再次空闲(即初始化完成)才更新。

我已经使用“paintImmediately”重绘了 JProgressBar,但我似乎无法让它对 JLabel 和对话框本身正常工作。有没有什么简单的推荐/经过验证的方法来完成这个?

干杯...

编辑:添加一个我正在尝试做的例子;当然,大大简化了。

只要 EDT 很忙,由上面调用progressBar.setValue()/引起的重绘当然会排队,并在我们全部完成后导致重绘,而不是一路更新..progressLabel.setText()

0 投票
3 回答
8219 浏览

java - java swing清除事件队列

是否可以以标准方式执行此操作?

这是场景。

  1. 开始在 EDT 中做一些昂贵的事情(EDT 被阻塞,直到昂贵的操作结束)。

  2. 当 EDT 被阻止时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。

  3. 当 EDT 空闲时(用昂贵的东西完成),它开始处理鼠标事件。

我在步骤 3 中想要的是丢弃堆积的鼠标事件。在 EDT 空闲后,任何新的鼠标事件都应该以通常的方式处理。

关于如何实现这一目标的任何想法。

PS:我无法阻止 EDT 被阻塞(我无法控制程序中某些模块的行为)。

编辑:如果我可以安全地调用“SunToolkit.flushPendingEvents()”,那么我总是可以在 EDT 中开始昂贵的操作之前放置一个玻璃窗格。在 EDT 线程上的昂贵操作结束后,刷新所有事件 - 它们将进入一个不会做任何事情的玻璃窗格。然后让 EDT 正常工作。

EDIT2:我添加了一个 SSCCE 来演示这个问题。

  1. 运行 SSCCE

  2. 单击“等待 3 秒”按钮。它模拟了昂贵的操作。鼠标光标将变为忙。

  3. 当光标忙时,单击切换按钮“单击我”。如果在三秒后,切换按钮改变了它的状态,那么鼠标事件被切换按钮接收并且没有被捕获。

我希望当光标看起来很忙时,丢弃生成的鼠标(和其他)事件。

谢谢。

0 投票
5 回答
34955 浏览

java - SwingUtilities.invokeLater

我的问题与SwingUtilities.invokeLater. 我应该什么时候使用它?每次需要更新 GUI 组件时都必须使用吗?它究竟是做什么的?是否有替代方案,因为它听起来不直观并且添加了看似不必要的代码?