gpt4 book ai didi

java - 如何设计也响应后端事件的 Java Swing 模型?

转载 作者:行者123 更新时间:2023-11-30 07:32:13 27 4
gpt4 key购买 nike

我已经编写了一个用于操作读卡器的 GUI - 主要由一个 ADD 按钮组成,该按钮调出一个 FileChooser 对话框并将所选的 File 排队到一个 CardHopper 上,它在视觉上显示为 JList

现在我想让 CPU(另一个 JFrame,在另一个线程上)能够向读卡器发出请求;例如读一张卡片寄给我。在读卡器有 GUI 之前,它只是一个与 CPU 在同一线程上运行的模型,所以我可以调用它的 readCard() 方法。现在它在一个单独的线程上,似乎正确的通信方式是消息传递。

我正准备使用 PriorityBlockingQueue 实现一些功能,CPU 将放入 读卡命令到队列中,CardReader 将接受 code> 并执行命令,直到我意识到 CardReader 线程通常会在其 NetBeans 提供的 Swing 代码中的某处被阻塞,等待 GUI 事件并且对我的事件队列中任何内容的到来视而不见。此外,这个“后端”请求会改变数据模型 - 所以即使我可以以某种方式在模型中执行一些代码,“触发”通知到 GUI 的 ListDataListeners 是否合乎规范? 当 GUI 正在等待 GUI 事件时?

我希望这不是太神秘 - 我仍在努力了解 GUI 和线程的机制。

最佳答案

Would it be kosher to "fire" notifications to the GUI's ListDataListeners while the GUI is waiting for GUI events?

绝对不是。

您要做的是在 Swing 事件线程上执行直接操作 UI 模型(或调用 UI 函数)的所有任务。

基本上,当您准备好发布将执行某些 UI 任务的事件时,请执行以下操作:

SwingUtilities.invokeLater(new Runnable() {
public void run() {
...
}
}

您可以触发所有监听器,并在那里对您的 ListModel(或其他 UI 模型)执行任何您想做的事情,因为它只会在 Swing 线程中运行。

否则,当 Swing 正在绘制并且您正在更新数据时,您可能会冒着 Swing 尝试读取您的数据的风​​险。您将开始获取 NullPointerException、ArrayIndexOutOfBoundExceptions、ConcurrentModifictionException 等。

理想情况下,您将在单独的线程(或在 SwingWorker 下)执行所有后台工作,然后在一切准备就绪后,通过 invokeLater 推送更新。

关于java - 如何设计也响应后端事件的 Java Swing 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com