2013-02-19 80 views
1

我有一個JTable自定義渲染器。點擊JTable中的某個項目時,我執行一系列影響模型的特定操作。我有兩個選擇來實現這一點:在JTable中使用JButton&Action有什麼缺點?

ListSelectionListener :我在我的整個JTable其中火添加監聽單擊某一行的時候。然後我執行這些操作。

  • 優點:可以讓我選擇行(對我來說不是必需的)的任何部分,可能是擺方式試圖事件是火一個JTable
  • 缺點:我要創建一個自定義類來處理這個和重現代碼。

實施例:

class Selector implements ListSelectionListener { 
    @Override 
    public void valueChanged(ListSelectionEvent event) { 
     // ... write the action code here 
    } 
} 

的JButton &行動 :我渲染JButton並添加ActionJButton

  • 優點:我可以重複使用Action,如果我改變Action,使用它的所有實例將被更新。
  • 缺點:我將邏輯移到我的渲染代碼中。

例子:

class Renderer implements TableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
         boolean isSelected, boolean hasFocus, int row, int col) { 
     JButton btn = new JButton(value.toString()); 
     btn.setAction(new SpecificAction()); 
     return btn; 
    } 
} 
  1. 如果我用的是第二種方案,將火雨從天上下來?

  2. 他們都是同樣可行的嗎?

  3. 有沒有辦法在ListSelectionListener內使用Action

+1

你有沒有考慮創建一個CellEditor的,而不是來執行代碼? – 2013-02-19 19:42:52

+0

@JonathanDrapeau我沒有提到CellEditor,但你沒錯,選項2需要實現CellEditor來實際觸發Action。我選擇添加一個匿名ListSelectionListener並手動創建/激發Action。 – sdasdadas 2013-02-19 19:57:00

回答

2

沒有你的具體使用情況的瞭解,這裏是我的想法:

1)我不會用一個ListSelectionListener。有些用戶傾向於通過箭頭鍵滾動瀏覽表格。我不希望聽衆只是因爲用戶使用箭頭鍵「滾動」而觸發。但是,我已經將其用於一些特定的,不太常見的情況。

2)我會用一個渲染器在單元中顯示一個JButton,然後在表上添加一個MouseListener。將座標從mouseClicked事件轉換爲表格單元格。如果單元格有一個ButtonRenderer,然後觸發相應的代碼。這更有可能濾除不需要的操作,因爲點擊特定的單元格更可能是用戶的有意操作。

編輯:

下面是羅布Camick的網站解決方案:Table Button Column

而且它在這裏一個簡短的討論:Adding button to JTable

+0

你的(1)是一個偉大的觀點。但是,對於(2),只是在按鈕本身上設置一個監聽器而不是手動轉換鼠標單擊會更好嗎? – sdasdadas 2013-02-19 19:03:47

+0

可能和/或可能。我不得不再想一想。 – splungebob 2013-02-19 19:12:20

+0

+1爲黑暗的好鏡頭:-) – mKorbel 2013-02-19 21:00:47