2012-03-14 61 views
1

在我的應用程序中有一個JTable,我想在創建表之後插入行。Java:如果行被AbstractTableModel插入,如何將行(數據)插入到JTable中

以下所有代碼都在框架的構造函數中。

代碼:

private TableModel model = new AbstractTableModel(){ 
String[] columnNames = {"First Name","Last Name","Sport","# of Years","Vegetarian"}; 
private Object[][] data = {}; 

      public int getColumnCount() { 
       return columnNames.length; 
      } 

      public int getRowCount() { 
       return data.length; 
      } 

      public String getColumnName(int col) { 
       return columnNames[col]; 
      } 
      public Class getColumnClass(int c) { 
       return getValueAt(0, c).getClass(); 
      } 

      public Object getValueAt(int row, int col) { 
       return data[row][col]; 
      } 
      public boolean isCellEditable(int row, int col) { 
       retuen false; 
      } 
      public Class getColumnClass(int c) { 
       return getValueAt(0, c).getClass(); 
      } 
}; 

table = new JTable(model); 
table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
table.setFillsViewportHeight(true); 

JScrollPane scrollPane = new JScrollPane(table); 
scrollPane.setBounds(5, 218, 884, 194); 
//now adding this to the frame where I want to show 
frame.add(scrollPane); 

現在我要插入行或數據到表中。這怎麼可能。 以前我用DefaultTableModel,但我們不能在DefaultTableModel中使用isCellEditable和其他方法,所以我改變了上面的代碼。但在上面的代碼中,我無法顯式插入數據(行),請幫助我。

回答

7

這樣,就可以實現其他方法一樣deleteRow(INT的rowIndex)和insertRowToIndex(INT的rowIndex,列表rowData) 。

Rememer更改數據之後,你不得不解僱的表事件,如fireTableRowsInserted()等

public static class MyTableModel extends AbstractTableModel 
{ 
    private List<String> columnNames = new ArrayList(); 
    private List<List> data = new ArrayList(); 

    { 
     columnNames.add("First Name"); 
     columnNames.add("Last Name"); 
     columnNames.add("Sport"); 
     columnNames.add("# of Years"); 
     columnNames.add("Vegetarian"); 
    } 

    public void addRow(List rowData) 
    { 
     data.add(rowData); 
     fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 

    public int getColumnCount() 
    { 
     return columnNames.size(); 
    } 

    public int getRowCount() 
    { 
     return data.size(); 
    } 

    public String getColumnName(int col) 
    { 
     try 
     { 
      return columnNames.get(col); 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 
    } 

    public Object getValueAt(int row, int col) 
    { 
     return data.get(row).get(col); 
    } 

    public boolean isCellEditable(int row, int col) 
    { 
     return false; 
    } 

    public Class getColumnClass(int c) 
    { 
     return getValueAt(0, c).getClass(); 
    } 
}; 

public static void main(String[] args) 
{ 
    MyTableModel model = new MyTableModel(); 

    model.addRow(Arrays.asList("yi", "chen", "sleep", 35, true)); 

    JTable table = new JTable(model); 
    table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
    table.setFillsViewportHeight(true); 

    JScrollPane scrollPane = new JScrollPane(table); 
    scrollPane.setBounds(5, 218, 884, 194); 
    //now adding this to the frame where I want to show 
    JFrame frame = new JFrame(); 
    frame.add(scrollPane); 
    frame.setVisible(true); 
} 
+0

好的...如果我想添加行形式的應用程序的其他方法,那麼代碼是什麼? – 2012-03-14 09:19:47

+0

用於擴展用於自定義api的AbstractTableModel的+1。但是:在一個匿名類中這樣做沒有多大意義..這可能是@VinitVikash正在絆倒的:-) – kleopatra 2012-03-14 11:17:52

+0

已更新的代碼,使其清晰明瞭。 – chenyi1976 2012-03-14 22:53:54

1

只是從DefaultTableModel延伸而不是從AbstractTableModel延伸應該做的伎倆。

+0

,但如果我使用的DefaultTableModel,然後我一個沒能在我的表多數民衆贊成使用的isCellEditable和其他方法爲什麼我將DefaultTableModel更改爲AbstractTableModel。 – 2012-03-14 07:41:08

1

AbstractTableModel上不會做你想做的事,爲此,你需要使用的DefaultTableModel什麼,

當您使用的DefaultTableModel,您可以在以下方面設置的isCellEditable或任何其他方法,

DefaultTableModel model = new DefaultTableModel(data, columnNames) { 
     private static final long serialVersionUID = 1L; 

     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return false; 
     }  
    }; 

在上面的代碼中數據將是String [] []。通過編寫上面的代碼,您可以將單元格編輯爲false。

除此之外,您還可以在擺動工具中加載數據,或者像您可能已經完成的後綴一樣。

+0

_you需要使用DefaultTableModel_不一定:擴展AbstractXX並添加api也會訣竅:-) – kleopatra 2012-03-14 11:29:40

1

@Peter是正確的+1使用DefaultTableModel而不是AbstractTableModel,因爲你錯過了AbstractTableModel方法addRow();(和其他方法太)

public void addRow(Object[][] data) { 
    this.data.add(data); 
    this.fireTableRowsInserted(data.size() - 1, data.size() - 1); 
} 

例如約AbstractTableModel