2013-04-07 52 views
1

我找到的示例: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm 顯示如何使用指定列(按鈕)創建JTable。它工作正常,但我的問題是,我需要使用AbstractTableModel而不是DefaultTableModel(如示例所示)。AbstractTableModel和單元格編輯器

所以我創建了自己的TableModel,它擴展了AbstractTableModel上:

public class TableModel extends AbstractTableModel { //..
}

代替:

DefaultTableModel dm = new DefaultTableModel(); 
dm.setDataVector(new Object[][] { { "button 1", "foo" }, 
    { "button 2", "bar" } }, new Object[] { "Button", "String" }); 

JTable table = new JTable(dm); 

爲:

JTable table = new JTable(new TableModel()); 

然後沒有任何反應,當我將點擊某一行的按鈕。有什麼建議麼?

+0

'我需要使用,而不是DefaultTableModel' AbstractTableModel上請爲什麼,有沒有特殊的理由限制的東西,無論覆蓋直接在'DeafultTableModel'中實現,'1.'這裏有一些關於如何編寫AbstracTableModel的問答,'2.'點擊鼠標到你的問題下的AbstractTableModel標籤,'''搜索Java&Swing&JTable& AbstractTableModel,'4.'閱讀Oracle教程如何使用表格 – mKorbel 2013-04-07 21:53:46

回答

4

確保您覆蓋AbstractTableModel.isCellEditable方法返回true用於按鈕的列,否則編輯器將不會被觸發。此方法默認返回false

此外,請確保您覆蓋getColumnName()以返回正確的名稱,因爲您鏈接的示例嘗試查找名稱爲「Button」的列以設置編輯器。

您可能會發現@camickr的Table Button Column實現有用。

該演示模型的工作與鏈接的樣本編輯器和渲染OK:

public class DemoTableModel extends AbstractTableModel { 
    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return (columnIndex == 0); 
    } 

    @Override 
    public int getRowCount() { 
     return 2; 
    } 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public String getColumnName(int columnIndex) { 
     switch (columnIndex) { 
     case 0: 
      return "Button"; 
     case 1: 
      return "Value"; 
     } 
     return null; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     switch (columnIndex) { 
     case 0: 
      return "Button"; 
     case 1: 
      return "Value"; 
     } 
     return null; 
    } 
} 
+1

覆蓋AbstractTableModel.isCellEditable解決了我的問題。謝謝你的時間。 – 2013-04-08 07:50:09

+0

@yebieoLL不客氣! :) – tenorsax 2013-04-08 15:42:10