问题标签 [edt]

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 回答
2018 浏览

unix - 适用于 unix 或 pc 的 VMS 编辑器 EDT 的免费软件克隆?

我希望在我经常使用的所有平台上都可以使用相同的编辑器。

Emacs 和 Vi 不是理想的解决方案。

0 投票
2 回答
459 浏览

java - 为什么首先要使用 EventDispatchThread?

这是我不明白的设计决定。

Android 和 JME 都遵循启动应用程序的线程是 UI 线程的策略,并且您注意将消耗资源的东西卸载到另一个线程。

另一方面,在 Swing 中,您EventQueue.invokeLater(Runnable)用于 UI 和SwingWorker后台处理。

现在,主线程是做什么用的?

0 投票
2 回答
1714 浏览

java - 主动渲染和 EDT(Swing 动画)

我应该如何在 Swing 小程序中运行动画?

我有一个执行主动渲染的动画线程,它最初的动画效果很好。有时(从 1 分钟到 2 小时后)它开始无法更新屏幕,只出现声音。我相信这是由于没有从 EDT 执行绘制导致某种并发问题。

那么,是否应该只从 EDT 调用活动渲染(即 getGraphics() 和绘画)?这样做的一个问题是 Swing 计时器缺乏精度。

或者有没有人在不使用 EDT 的情况下成功地进行主动渲染,并完全禁用对页面的任何 EDT 更新(可能使用 Canvas / 或忽略 JPanel 上的重绘)?

0 投票
4 回答
4134 浏览

java - 用于复杂类交互的 Java Swing 设计模式

我正在开发一个具有多个子系统的 java swing 应用程序。出于所有意图和目的,假设我正在制作一个带有随机附加功能的互联网聊天程序。该功能将是......一个调度程序,您可以在其中设置时间并在该时间收到提醒,并通知您朋友列表中的每个人您收到提醒。

将此功能组织成三个类是有意义的:GUI、ChatManager 和调度程序。这些类将执行以下操作:

GUI - 定义所有摇摆组件和事件
ChatManager - 创建聊天连接,发送和接收消息,管理好友列表
调度程序- 监控系统时间,发送通知,存储文件以记住会话之间的事件

为了使程序正常工作,这些类中的每一个都必须能够与其他两个类进行通信。GUI 需要告诉 ChatManager 何时发送消息并告诉 Scheduler 何时开始监控。ChatManager 需要在收到消息时在 GUI 上显示消息,最后,Scheduler 需要在完成时通知 GUI,并向 ChatManager 发送状态更新或其他任何内容。

当然,这里描述的类都非常简单,让它们直接相互通信可能不是一个坏主意。但是,为了这个问题,我们假设交互要复杂得多。

例如,假设我们可以向调度程序注册特定事件而不是特定时间。发送消息时,我将消息发送给用户,将其存储在日志文件中,创建事件对象并将其传递给调度程序,并处理沿途可能引发的任何异常。

当通信变得如此复杂时,如果与这些类的通信可能发生在许多不同的地方,那么维护代码就变得很困难。例如,如果我要重构 ChatManager,我可能还需要对 GUI 和调度程序(以及其他任何东西,如果我引入新的东西)进行重大更改。这使得代码难以维护,并使我们睡眠不足的程序员在进行更改时更有可能引入错误。

最初似乎最有意义的解决方案是使用调解器设计模式。这个想法是这三个主要类都没有直接相互感知,相反,每个类都感知到一个中介类。反过来,中介类定义了处理三个类之间通信的方法。因此,例如,GUI 将调用中介类中的 sendMessage() 方法,中介将处理需要发生的所有事情。最终,这将三个主要类解耦,对其中一个类的任何更改都可能只会导致对中介的更改。

然而,这带来了两个主要问题,最终导致我来到这里寻求反馈。它们如下:

问题

  1. 许多任务需要更新 GUI,但中介者不知道这些组件。- 假设用户启动程序并输入他们的用户名/密码并单击登录以登录到聊天服务器。登录时,您希望通过在登录屏幕上显示文本来报告登录过程,例如“正在连接...”、“正在登录...”或“错误”。如果您在 Mediator 类中定义登录方法,那么显示这些通知的唯一方法是在 GUI 类中创建一个公共方法来更新正确的 JLabel。最终,GUI 类将需要大量方法来更新其组件,例如显示来自特定用户的消息、在用户登录/注销时更新您的朋友列表等等。此外,您必须预料到这些 GUI 更新可能随时随机发生。可以吗?

  2. Swing 事件调度线程。您将主要从在 EDT 上执行的组件 ActionListener 调用中介方法。但是,您不想在 EDT 上发送消息或读/写文件,否则您的 GUI 将变得无响应。因此,在中介对象中提供一个 SingleThreadExecutor 是否是个好主意,中介对象中的每个方法都定义一个可以提交给执行线程的新可运行对象?此外,更新 GUI 组件必须在 EDT 上进行,但该 Executor 线程将调用方法来更新 GUI 组件。因此,GUI 类中的每个公共方法都必须将自身提交给 EDT 以执行。那有必要吗?

对我来说,在 GUI 类中有一个方法来更新每个以某种方式与外部通信的组件似乎需要做很多工作,其中每个方法都有额外的无意中检查它是否在 EDT 上,并将自身添加到EDT 否则。此外,Mediator 类中的每个公共方法都必须执行类似的操作,要么将 Runnable 代码添加到 Mediator 线程,要么启动一个工作线程。

总体而言,使用 Mediator 模式维护应用程序的工作量似乎几乎与不使用它维护应用程序的工作量一样多。所以,在这个例子中,如果有的话,你会做些什么不同的事情?

0 投票
3 回答
3050 浏览

java - Swing:更改隐藏框架上的标签,然后显示框架在 EDT 上以相反的顺序发生

问题

我在 swing 中创建了一个对话框(JRE 6 update 10,Ubuntu linux)。当用户完成使用对话框时,它会被隐藏。当用户单击另一个框架中的按钮时,框上的标签会根据按钮而改变,然后框再次显示。

我遇到的问题是该框显示在标签更改之前,即使以编程方式,我以相反的顺序进行调用。这会导致该框出现,然后是标签更改,这在我们的慢速目标硬件上看起来“有问题”。EDT 似乎在标签setText(....)之前安排了框架setVisible(true ) ;它优先考虑这个呼叫。有没有办法让 EDT 安排setVisible(true)setText(....)之后执行?

请注意,代码是从已在 EDT 上执行的按钮单击调用的,因此无法使用SwingUtilities.invokeAndWait。我试过使用invokeLater方法,但 EDT 仍然重新安排它。

重现

在调试模式下在 IDE 中运行以下代码,并在显示和隐藏“对话框”框架后中断showButton的操作代码。标签的setText(....)更改不会立即对 GUI 产生影响,但框架的setVisible(true)会。然后单步执行 EDT,您会看到setText最终发生在 EDT 计划的更下方。

0 投票
4 回答
552 浏览

java - 事件调度线程符合 Java 内存模型

这与我之前提出的一个问题有关,答案是:

如果一个字段被多个线程访问,它应该是 volatile 或 final,或者只能使用同步块访问。否则,分配的值可能对其他线程不可见。

此外,任何在屏幕上操作像素的东西都应该从事件调度线程中运行,尽管当您使用重绘/绘制时这会被透明地处理。

因此,根据我的理解,我们需要担心像精灵在屏幕上移动的动画这样简单的东西的内存模型。

我的问题是,这种理解是否正确,而 Sun 教程示例,例如TumbleItem ( source ) 不正确?

0 投票
2 回答
1511 浏览

java - 如何在不阻塞 EDT 的情况下等待 EDT 中的对象创建?

我在 Java 库中使用 API,该 API 从事件调度线程调用并要求我返回完全初始化的 UI 组件。它看起来像这样:

但我只能在从数据库加载后填充对话框,有时可能需要 10 秒。通常我会在后台线程中执行此操作,但由于此方法是从 EDT 调用的,并且由于我必须返回对话框,所以这不起作用。它是一个第三方库,所以我无法更改方法,但有什么办法可以避免阻塞 EDT?

0 投票
4 回答
569 浏览

java - TreeSet 行为怪异

TreeSet ( sortedNodes) 和 ArrayList ( nodes) 有一个奇怪的问题。在我的程序中,我有一个从事件调度线程(来自ActionListener)调用的方法,这些行:

问题是,在某些集合上sortedNodes.size()返回的数字低于nodes.size()(在这 3 行上,因此 的内容没有变化nodes)。然后,当我打印 的内容时sortedNodes,除了不包含它应该包含的所有对象之外,它甚至都没有排序。奇怪的是 - 如果我再次调用整个方法,它会解决问题。我不明白 - 在相同的集合上执行相同的代码,但第一次不起作用,第二次起作用。有任何想法吗?

编辑:如果我的问题不是很清楚,这应该会有所帮助

在输出上打印:

比较器:

节点:

整体方法:

我还更改了程序,因此每次创建/删除 NodeShape 时,也会将 Node 添加/删除到新集合中,我在 exportTree() 中使用这个新集合而不是 nodeShapes - 但它的工作原理相同,所以 nodeShapes 没有问题. 它只是 TreeSet .. 当我不使用它时,一切正常(但我没有对节点进行排序)。

0 投票
1 回答
1163 浏览

java - 无法让 Swing 刷新 JLabel(显然在事件调度线程上)

我有这个动作监听器:

}

refreshScreen()s 似乎不起作用。它们显然在 Event Dispatcher 线程上运行,所做的更改仅在动作侦听器执行结束时显示。从 MokkiGUI() 构造函数调用时它工作正常,因为它不在 EDT 上。

0 投票
1 回答
164 浏览

java - EDT 违规是否有可能在外部软件中导致 NullPointerException?

我有一个最近集成到另一个 Java 软件(我将称之为“外部”软件)中的 Java 软件。我们使用侦听器和回调机制在两个软件之间进行“通信”。

“外部”软件的创建者说,由于我的代码中存在一些 EDT 违规,他们得到了 NullPointerException。可以吗?