好吧,我知道我刚刚问了一个类似的问题,但我试图简化它,所以我使用了一个看起来很糟糕的例子,这个例子有一个我没有预料到的问题,从而得到了我没有想到的答案解决不了我的问题。
我有这样的设置:
我在 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/