2012-06-06 6 views
9

Javaカスタムドラッグ&ドロップ - TransferHandlerへのコールバックなし。JPanelのJavaカスタムドラッグアンドドロップ

JPanel サブクラスのカスタムドラッグアンドドロップ機能を実装したいと思います。

表面に

Drag and Drop and Data Transfer

は、物事はかなりstrightforwardように見えるが、私は実際に がそれをしようとしたとき、私は、任意のドラッグ&ドロップ動作が起こっているという兆候を取得していない:私は、標準的なドラッグ&ドロップのチュートリアルのガイドラインに従います。 実際には、私のTransferHandler内のどのメソッドも呼び出されません。だから、

、のは、私が何をしたか確認しましょう...

私はJPanelのを拡張するために自分自身を宣言し、私自身のコンテナクラスを作った:

public class DnDUnitPanel extends JPanel 
{ 
    ... 
} 

私はこのデモからListTransferHandlerをコピー:

Drop Demo

は、DndUnitTransferHandlerとしてクラス名を変更し、 というJList obそこに5つのメソッドのそれぞれにSystem.out.println()ステートメント をインストールしました。

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のインスタンスを作成し、パネル (図示せず)に)(それらを追加):

私は、このようDnDUnitPanelの2つの異なるインスタンスをインスタンス化します。

JLabelをあるパネルから別のパネルにドラッグしようとすると、何も起こりません。 だから私は戻って、このページを再読:

特に

Transfer Handler

、それは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自体のソースを見て、 「ドラッグジェスチャーをサポートしていますが、」実際には関連するgetterとsetterを持つ 「でdragEnabled」プロパティを持っているものを意味することを決めました。

だから、私は、プロパティを宣言しただけ(多分私は完全には理解していない何かが isDragEnabled()を呼び出し、真の値を探している を考えてまっすぐするJList自体からコードをコピーして DnDUnitPanelにゲッターとセッターを提供しました

残念なことに、上記の呼び出しをオフにして、 DnDUnitPanel.setDragEnabled()への呼び出しのコメントを解除しても効果はありませんでした。

だから... TransferHandlerは決して呼び出されません()。明らかに、何か がここにはありませんが、私はそれが何であるか見ていません。

私は次に何を試しても駄目です。

ここには何が欠けていますか?

答えて

11

基本的にデータソースが必要です。

Stackoverflow questionを見て、herehere(ドラッグ&ドロップの良い説明)

+1

私はドラッグ&ドロップ技術への新規参入者が上つまずく傾向があることが主なものは、あなたがあなた自身のMouseListenerかのMouseMotionListenerを提供する必要があることを認識されていないと思いますドラッグを開始する(カスタムコンポーネントの場合、ネイティブでサポートを提供しない)。私は[dreamincode example](http://www.dreamincode.net/forums/topic/209966-java-drag-and-drop-tutorial-part-1-basics-of-dragging/)が最も有用であることを発見しました。ありがとう、@ゼオンあなたの答えです。 – user1441004

+0

その最後のリンクは404'dです –

+0

@ChrisDrappier私はちょうどそれを更新しました – Xeon