2012-03-14 5 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を使用しましたが、私は上記のコードでそれを変更するので、isCellEditableと他のメソッドをDefaultTableModelで使用することはできません。しかし、上記のコードでは、データ(行)を明示的に挿入できません。私を助けてください。

答えて

7

を、あなたは、deleteRowを(int型rowIndexプロパティ)とinsertRowToIndex(rowIndexに、リストrowDataをint型)のような他の方法を実装することができます。

あなたがデータを変更した後、あなたはfireTableRowsInserted(のようなテーブル・イベントを、発射する必要がありRememer)など

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

ok ...行のフォームをアプリケーションの他のメソッドに追加したい場合は、コードは何ですか? –

+0

カスタムAPIのためのAbstractTableModelを拡張するための+1。しかし、匿名のクラスでそうすることはあまり意味がありません。それはおそらく@VinitVikashがつまずいているのです:-) – kleopatra

+0

コードを更新して、それをきれいにしてください。 – chenyi1976

1

AbstractTableModelから延期するのではなく、DefaultTableModelから延期するだけで、このトリックを行う必要があります。あなたはDefaultTableModelのを使用するときは、次の方法でisCellEditableや他の方法を設定することができます

+0

が、私はのDefaultTableModelを使用している場合、私のテーブルのthatsにisCellEditableや他の方法を使用して、私はできませんなぜDefaultTableModelをAbstractTableModelに変更するのですか? –

1

AbstractTableModelには、あなたがのDefaultTableModelを使用する必要があり、この目的のために、何をしたいのかしないだろう

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

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

上記のコードのデータはString [] []になります。上記のコードを書くことで、セル編集可能をfalseに設定します。

これ以外にも、あなたが行ったようなスイングワーカーや後でデータを読み込むことができます。

+0

_あなたは必ずしもDefaultTableModel_を使用する必要があります:AbstractXXを拡張して、APIを追加することでもトリックを行います:-) – kleopatra

1

@Peterは(あまりにも、別の方法)あなたのAbstractTableModel逃した方法addRow();ので、むしろAbstractTableModelより右+1使用DefaultTableModelある

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

例についてAbstractTableModel

0

私はあなたがsetValueAt()機能を実装する必要があると思いますあなたのAbstractTableModelで、その位置のデータを変更できるようにします。

次のチュートリアルをよく見ましょう:このように

http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

http://www.informit.com/articles/article.aspx?p=332278

+0

データを編集したくありません。私はデータや行を挿入したい。 –

関連する問題