私のアプリケーションには、DnD によって動かされるはずのいくつかの JPanel が含まれています。すべてのリスナーとハンドラーを実装しました。すべてが正しいようです。マウスで 1 つのパネルをドラッグすると、DragGestureListener がそれを認識し、新しい DragAction を開始したいと考えています。
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
// When the drag begins, we need to grab a reference to the
// parent container so we can return it if the drop
// is rejected
Container parent = getPanel().getParent();
setParent(parent);
// Remove the panel from the parent. If we don't do this, it
// can cause serialization issues. We could over come this
// by allowing the drop target to remove the component, but that's
// an argument for another day
parent.remove(getPanel());
// Update the display
parent.invalidate();
parent.repaint();
// Create our transferable wrapper
TicketTransferable transferable = new TicketTransferable(getPanel());
// Start the "drag" process...
dge.startDrag(null, transferable);
}
ただし、次の例外が発生します。
exception in thread "AWT-EventQueue-0" java.awt.dnd.InvalidDnDOperationException:
Cannot find top-level for the drag source component
at sun.awt.X11.XDragSourceContextPeer.startDrag(XDragSourceContextPeer.java:126)
at sun.awt.dnd.SunDragSourceContextPeer.startDrag(SunDragSourceContextPeer.java:134)
XDragSourceContextPeer を確認したところ、ドラッグを適切に開始するには、DragAction をトリガーするコンポーネント (私の場合、JPanel 自体を移動するための JPanel) が「ウィンドウ」タイプである必要があることがわかりました。ポイントは、私のJPanelがウィンドウではなく、前述の例外がスローされることです。
私は何を間違っていますか?
PS: すべての「移動可能な」パネルは、JTable の異なるセルにあります。