java - EDT 与 Listener

标签 java swing event-dispatch-thread

好吧,我知道我刚刚问了一个类似的问题,但我试图简化它,所以我使用了一个看起来很糟糕的例子,这个例子有一个我没有预料到的问题,从而得到了我没有想到的答案解决不了我的问题。

我有这样的设置:

我在 EDT 中有一个方法。它在一堆 JTextArea 中循环,并删除空的 JTextArea。

那么有什么问题吗?

每次删除 JTextArea 时,都会触发一个监听器,然后在视觉上更新 GUI(将 JTextArea 下面的所有可视对象向上拉)。

那么会发生什么呢?好吧,当循环执行时,JTextAreas 并没有被视觉上删除,它们被添加到 EDT 队列中(我猜),然后在循环完成后立即全部删除。然后发生的事情是所有监听器同时触发并弄乱整个 GUI。

由于所有内容都在 EDT 上运行,我希望代码的行为如下:

  • 开始循环
  • 查找一个空的 JTextArea
  • 完全删除空的 JTextArea -> 触发监听器
    • 在监听器中执行代码
  • 继续循环
  • 查找下一个空的 JTextArea
  • 冲洗并重复直至达到循环结束

如何强制我的程序像这样运行?

我应该创建一个新线程来搜索空白 JTextAreas,并在 invokeLater(new Runnable()) 中完成删除吗? 执行搜索的实际代码实际上不是 CPU 专用的,它只通过 JTextAreas 的 arrayList 并检查 getText().equals(""),所以我真的认为这没有必要......

最佳答案

删除单个文本区域。确定是否还有更多要删除的内容,如果是,则使用 SwingUtilities.invokeLater() 对任务进行排队,该任务会回调到当前代码。重复此操作,直到删除所有文本区域。

关于java - EDT 与 Listener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149531/

相关文章:

java - GUI 在 EDT 上显示

java - 使用事件队列在 main() 中执行一个简单的方法

java - 了解频繁更新的真实模型中的 EDT

java - java.util.regex.Pattern.quote(String arg) 的 GWT 替代品是什么

java - org.apache.catalina.connector.CoyoteAdapter 服务严重 : An exception or error occurred in the container during the request processing

java - 如何在 Java 中拼接图像对象

java - 动态添加 JComponents 到 JFrame

java - 如何在单独的文件中制作 GUI 程序

java - 使用EasyMock很好地实现了单元测试

java - 当我的 Java 应用程序运行时禁用 Mac 字符重音菜单