Javaカスタムドラッグアンドドロップ-TransferHandlerへのコールバックはありません。
JPanelサブクラスにカスタムドラッグアンドドロップ機能を実装したいと思います。標準のDnDチュートリアルのガイドラインに従います。
一見、物事はかなり単純に見えますが、実際に試してみると、DnDの動作が発生していることを示すものはありません。実際、TransferHandlerのどのメソッドも呼び出されていません。
それで、私がしたことを確認しましょう...
JPanelを拡張することを宣言する独自のContainerクラスを作成しました。
public class DnDUnitPanel extends JPanel
{
...
}
このデモからListTransferHandlerをコピーしました。
クラスの名前をDndUnitTransferHandlerに変更し、JListオブジェクトを参照するコードを削除し、そこにある5つのメソッドのそれぞれにSystem.out.println()ステートメントをインストールしました。
次に、次のようにDnDUnitPanelの2つの異なるインスタンスをインスタンス化します。
DnDUnitPanel topPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// topPanel.setDragEnabled(true);
topPanel.setName("Top Panel");
topPanel.setTransferHandler(new DnDUnitTransferHandler());
DnDUnitPanel bottomPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// bottomPanel.setDragEnabled(true);
bottomPanel.setName("Bottom Panel");
bottomPanel.setTransferHandler(new DnDUnitTransferHandler());
(また、いくつかのJLabelインスタンスを作成し、それらをパネルに追加します(図には示されていません))。
JLabelをあるパネルから別のパネルにドラッグしようとしても何も起こりません。だから私は戻ってこのページを読み直しました:
特に、setDragEnabled()についての説明:
turns on drag support. (The default is false.) This method is
defined on each component that supports the drag gesture; the link
takes you to the documentation for JList.
JPanelにはsetDragEnabled()メソッドがありません。それで、私は自分自身に、それが本当に何を意味するのかを自問しました:「ドラッグジェスチャをサポートするコンポーネント」?
私は最初、これはMouseListenerやMouseMotionListenerを実装するために宣言された何かを意味するに違いないと考えました。DnDUnitPanelを変更して、両方を実装し、すべてのメソッドを提供することを宣言しました。そうすると、mousePressed()、mouseClicked()、mouseDragged()などが呼び出されていることがわかりましたが、TransferHandlerには何も呼び出されておらず、何かがドラッグされたか、準備ができていることを示すドラッグカーソルがありません。ドロップしました。
次に、JList自体のソースを調べて、「ドラッグジェスチャをサポートする」とは、実際には、関連するゲッターとセッターを持つ「dragEnabled」プロパティを持つものを意味することを決定しました。
そこで、プロパティを宣言し、JList自体からコードを直接コピーするだけでDnDUnitPanelにゲッターとセッターを提供しました(私が完全に理解していないことは、isDragEnabled()を呼び出して、DnDの動作を開始するための真の値を探すことだと思います)。
残念ながら、それらを提供する(および上記のDnDUnitPanel.setDragEnabled()への呼び出しのコメントを解除する)ことも効果がありませんでした。
したがって...TransferHandlerが呼び出されることはありません()。明らかに、ここには重要な何かが欠けていますが、それが何であるかはわかりません。
私は次に何を試すかについて行き詰まっています。
誰かがここに欠けているものを見ますか?