2009-08-12 58 views
5

我試圖將列添加到一個JTable有以下行爲(類似於Windows資源管理器和類似貝殼)*:製作一個JTable細胞可編輯的 - 但*不通過雙擊

  • 細胞可以是像往常一樣點擊一次以選擇它。
  • 可以雙擊單元格以執行單獨的操作(啓動外部程序)。
  • 單元格值(字符串)仍然可以通過單擊第二次(暫停後)或在單元格高亮顯示時按F2

雙擊要細胞觸發的編輯,但我想離開,如果可能的任何其他默認編輯觸發操作。

我曾嘗試加入MouseListener表,並消耗所有MouseEvent S,但這並不工作 - 如果我從isCellEditable()回到true那麼我的聽衆從來沒有收到任何點擊事件,但如果我回到false然後F2沒有更長的作品。

這可以通過只使用事件偵聽器來實現嗎?如果我能避免它,我寧願不要惹惱PLAF功能。

+0

[這裏](http://stackoverflow.com/a/25919008/738017)存在由[camickr](更近的答案http://stackoverflow.com/users/131872/camickr),其解決了4行代碼的問題。 – 2015-02-22 21:49:27

回答

3

你將不得不作出自己的cellEditor的和ovveride

public boolean isCellEditable(EventObject e) 

您可以單人和雙人的點擊之間,就在eventObject

使用clickCount區分。如果它是一個單一的點擊和對選定的cell可以返回true否則返回false;

檢索行和列與

int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); 
int column = ((JTable) e.getSource()).columnAtPoint(e.getPoint()); 

,使F2您可以添加自定義的InputMap連接ActionMap中的條目

similar too 
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown"); 
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

,並從你的行動,你可以隨後擊發cellediting自己

table.editCellAt(row, column); 
+0

這與我對代理所做的相似。我只重寫isCellEditable。關鍵筆畫處理程序包含在默認編輯器中。我不需要重新實現它。 – finnw 2009-08-13 08:08:45

4

DefaultCellEditor有一個setClickCountToStart()方法來控制鼠標點擊進行編輯。默認值是2.更改這將不會影響F2功能。

因此,您可以將編輯設置爲三次點擊。

不確定如何處理兩個單擊來開始編輯,但我想你會使用一個計時器來跟蹤第一次點擊,然後做編輯,如果第二次單擊是在你的時間間隔內。

+0

無需定時器 - 它只是需要爲雙擊註冊太慢。 – finnw 2009-08-12 20:57:54

1

我已經用Proxy包裝現有CellEditor和攔截來電isCellEditable,返回所有的鼠標事件虛假和委託其他所有調用原CellEditor解決了這個。

這比camickr的解決方案稍微複雜一點,但適用於所有編輯(我總共有4個。)

+0

我很想看到解決方案。此外,我不明白你如何區分單元格的初始點擊和點擊以啓動編輯。您的代碼是否只跟蹤最後選中的單元格,以及何時在開始編輯的同一單元格上獲得兩次單擊?如果是這樣,那麼第二次點擊可能是第二次或幾分鐘後。你最初的要求是在「暫停」之後說的,這就是爲什麼我建議一個定時器來控制暫停間隔的原因。 – camickr 2009-08-13 02:49:27

+0

@carnickr,我還沒有實現這部分尚未但是沒錯,聽起來權利。沒有時間限制。 – finnw 2009-08-13 08:37:30