Java 在Swing drop回调期间是否禁止更改组件层次结构?
我注意到,如果在处理拖放时执行Java 在Swing drop回调期间是否禁止更改组件层次结构?,java,swing,drag-and-drop,Java,Swing,Drag And Drop,我注意到,如果在处理拖放时执行removeAll(),add(),revalidate(),拖放将成功,更改将生效,但我将无法开始第二次拖动。任何后续的拖动尝试都将抛出一个java.awt.dnd.InvalidDnDOperationException:正在进行拖放 似乎如果对层次结构进行更改,则不会清除拖动,Swing认为仍有一个正在进行的拖动等待完成。即使在调用DropTargetDropEvent.acceptDrop()和DropTargetDropEvent.dropComplet
removeAll()
,add()
,revalidate()
,拖放将成功,更改将生效,但我将无法开始第二次拖动。任何后续的拖动尝试都将抛出一个java.awt.dnd.InvalidDnDOperationException:正在进行拖放
似乎如果对层次结构进行更改,则不会清除拖动,Swing认为仍有一个正在进行的拖动等待完成。即使在调用DropTargetDropEvent.acceptDrop()
和DropTargetDropEvent.dropComplete()
问题是,组件层次结构更改发生在拖动尚未完成时。调用
DropTargetDropEvent.dropComplete(true)
后,可以完成拖放,但不能完成拖动部分。在当前DropTargetListener.drop()
(EDT当前正在运行的内容)将控制权返回到EDT主循环后,拖动端可能会有回调在EDT中运行
因此,必须延迟组件层次结构更改,以便在拖动操作完成后运行这些更改
所以不是
if (SwingUtilities.isEventDispatchThread()) {
runnable.run();
} else {
SwingUtilities.invokeLater(runnable);
}
快跑
SwingUtilities.invokeLater(runnable); // unconditionally
这将安排runnable在拖动后运行,因为dropComplete()
已经在EDT事件队列中安排了一个事件来处理拖动完成。因此,invokeLater()
将把更改组件层次结构的代码放在标记拖动完成的事件之后
SwingUtilities.invokeLater(runnable); // unconditionally