2012-07-27 83 views
1

我正在嘗試添加拖放功能到我的應用程序,從而拖動事件的發起者是JTable。我目前使用內置的拖動支持JTable通過致電setDragEnabled(true)提供。不希望的拖放行爲與JTable

我面臨的問題是,要開始拖動操作,必須先點擊表格的一行,然後釋放鼠標;只有第二個鼠標按下(和所有後續的鼠標按下),產生拖動事件。即使JTable失去焦點,也會發生這種情況 - 即一旦執行了第一次左鍵單擊操作,拖放就可以完美地運行,直到我換入新的TableModel。當安裝新模型時,需要在拖動開始再次工作之前在表上左鍵單擊。

閱讀setDragEnabled(boolean)的API文檔意味着這是L的責任,因此可能沒有任何事情可以解決這個問題。有沒有人有什麼建議?我使用合金L & F,但不願改變它。

回答

1

setDragEnabled方法

當啓用自動拖動處理,大多數的外觀和感覺(包括那些子類BasicLookAndFeel中)的javadoc的報價開始的拖動和每當用戶在按下鼠標按鍵拖放操作一個項目(在單一選擇模式下)或一個選擇(在其他選擇模式下),然後將鼠標移動幾個像素。

如果我正確讀取它,當您使用單選模式時,您應該得到所需的行爲。

如果您需要將此行爲與多個選擇結合使用,則可以選擇手動處理表格上的傳入鼠標事件,然後在mouse_down上調整選定內容,然後將鼠標事件委託給JTable。所以在僞代碼中:

protected void processEvent(AWTEvent e) { 
    if (isMouseDownEvent(e)){ 
    adjustSelection(e); 
    } 
    super.processEvent(e); 
} 

注意:我還沒有測試過這個。它完全是基於我在javadoc中讀出,並可能有一些不必要的副作用爲JTable本身仍然會處理該事件,並作出反應就可以了

2

我發現了一個哈克的解決方案,這是添加MouseListener到在JTable和勾入TransferHandle的r exportAsDrag方法當按下鼠標:

final JTable actionTbl = new JTable(); 
    actionTbl.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent evt) { 
      // Need to explicitly start a drag operation when the mouse is pressed. 
      // Otherwise drags are only started *after* the user has clicked once 
      // on the JTable (this could be down to the L&F not doing the right thing). 
      actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.COPY); 
     } 
    }); 
0

亞當斯基的解決方案確實很好,但我不得不在最後一行改變TransferHandler.COPYTransferHandler.MOVE爲了它的工作:

final JTable actionTbl = new JTable(); 
actionTbl.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent evt) { 
     actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.MOVE); 
    } 
});