Java EDT与监听器

Java EDT与监听器,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,好吧,我知道我只是问了一个类似的问题,但我试图简化它,所以我用了一个看起来很糟糕的例子,一个我没有预料到的问题,从而得到了没有解决我问题的答案 我有这样的设置: 我在EDT中有一个方法。它在一堆JTextArea中循环,并移除空区域 有什么问题吗 每次删除JTextArea时,都会触发一个监听器,该监听器随后会直观地更新GUI(将JTextArea下方的所有可视对象向上拉) 那么会发生什么呢?嗯,在执行循环时,JTextAreas并没有被直观地删除,而是被添加到EDT que中(我猜是这样),然

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

我有这样的设置:

我在EDT中有一个方法。它在一堆JTextArea中循环,并移除空区域

有什么问题吗

每次删除JTextArea时,都会触发一个监听器,该监听器随后会直观地更新GUI(将JTextArea下方的所有可视对象向上拉)

那么会发生什么呢?嗯,在执行循环时,JTextAreas并没有被直观地删除,而是被添加到EDT que中(我猜是这样),然后在循环完成后立即删除它们。然后发生的事情是,所有侦听器一次触发,并将整个GUI搞乱

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

  • 启动周期
  • 找到一个空区域
  • 完全删除一个空的JTextArea->触发侦听器
    • 在侦听器中执行代码
  • 继续循环
  • 查找下一个空jtext区域
  • 冲洗并重复,直到达到回路末端
我怎么能强迫我的程序这样做

是否应该创建一个新的线程来搜索空白的JTaTaRas,并在VoCoEnter(new Runnable())中完成删除操作吗?


执行搜索的实际代码实际上不是CPU专用的,它只通过JTextAreas的arrayList进行检查,检查是getText().equals(“”),因此我认为没有必要这样做…

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

为了更快地获得更好的帮助,请发布一个。这是一个概念性的问题。不需要SSCCE。我不认为删除一堆组件是UI混乱的原因(我可以相信,但我认为还有其他原因)。如果您确实担心事件的顺序,可以使用
SwingUtilities.invokeAndWait
,它将等待
runnable
run
方法完成,而不像
invokeLater
runnable
放在事件队列的末尾并返回(几乎)立刻…@Karlovsky120然后只期待概念性的答案。我们提出的解决方案可能无法满足您的特定需求。
事实上,可视化删除似乎只有在方法运行之后才会发生。
这是正确的。EDT上的代码按顺序执行。因此,当你点击一个按钮开始你的处理,然后循环,然后GUI不会重新绘制自己,直到初始循环完成执行。如果您希望一次删除一个组件,那么这意味着某种动画,这意味着您应该使用计时器。因此,每次计时器启动时,您都会找到一个组件并将其删除。当没有更多的组件要移除时,停止计时器。