Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Swing drop回调期间是否禁止更改组件层次结构?_Java_Swing_Drag And Drop - Fatal编程技术网

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