2012-06-06 98 views
9

Java自定義拖放 - 對TransferHandler沒有回調。Java自定義拖放JPanel

我想爲JPanel 子類實現自定義拖放功能。我按照標準的DnD教程的準則:

Drag and Drop and Data Transfer

從表面上看,事情似乎很strightforward,但是當我真正 試試吧,我沒有得到任何指示,任何DnD的行爲發生。在 事實上,我的TransferHandler中沒有任何方法被調用。

那麼,讓我們來回顧一下我沒有...

我做我自己的容器類,它宣稱自己擴展JPanel:

public class DnDUnitPanel extends JPanel 
{ 
    ... 
} 

我從這個演示覆制ListTransferHandler Drop Demo

將該類重命名爲DndUnitTransferHandler,刪除了引用JList ob的代碼 並在其中的5個方法中的每一個上安裝了System.out.println()語句 。

我然後實例DnDUnitPanel的兩個不同的實例是這樣的:

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到另一個面板時,沒有任何反應。 等我回去重讀此頁:

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具有012ff'dragEnabled'屬性。

所以,我聲明過的屬性,並通過直接複製代碼直接從JList中本身所提供的getter和setter上 DnDUnitPanel(思 或許真的我不完全理解呼喚 isDragEnabled()和尋找真正的價值以啓動DnD行爲。)

不幸的是,提供那些(並且取消上述呼叫到 DnDUnitPanel.setDragEnabled())也沒有效果。

因此... TransferHandler永遠不會被調用()。顯然,這裏缺少重要的東西,但我沒有看到可能的東西。

我正處於死路一條,接下來要嘗試什麼。

有人看到了什麼在這裏失蹤?

回答

11

基本上你需要一個數據源。

看看其他Stackoverflow questionherehere(一個很好的DnD的解釋)

+1

我認爲最主要的是初來乍到的DnD技術往往絆倒上不承認,你必須提供自己的MouseListener或的MouseMotionListener開始拖動(對於自定義組件,本身不提供支持)。我發現[dreamincode示例](http://www.dreamincode.net/forums/topic/209966-java-drag-and-drop-tutorial-part-1-basics-of-dragging/)是最有用的。謝謝@Xeon的回答。 – user1441004

+0

最後一個鏈接是404'd –

+0

@ChrisDrappier我剛更新了它 – Xeon