0

JTable に AbstractTableModel を使用しています。

public class MyTableModel extends AbstractTableModel {

     private List<String> columnNames = new ArrayList<String>();
     private List<List> data = new ArrayList();

     MyTableModel() {
          columnNames.add("Action");
          columnNames.add("Count");
          columnNames.add("Total");
          columnNames.add("X");
          columnNames.add("Y");
          columnNames.add("Quarter");
          columnNames.add("Answer");
          columnNames.add("T (ms)");
     }

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

     public void insertRow(int index, List rowData) {
          data.add(0, 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();
     }     
}

重要ではないクラスでいくつかのコードを実行することにより、アプリケーションの実行中に新しい行を(成功して)追加します。このように見えます。

MyClass.MyTableModel.insertRow(0, (Arrays.asList(String.valueOf(valueOne), String.valueOf(valueTwo), String.valueOf(valueThree), 
                    String.valueOf(valueFour), String.valueOf(valueFive), String.valueOf(valueSix), String.valueOf(valueSeven), 
                    String.valueOf(valueEight), String.valueOf(valueNine))));
MyClass.myTable.setModel(MyClass.MyTableModel);
MyClass.myTable.repaint();

しかし、そのような追加された行の特定のセルのデータを変更することはできません。setValueAt() メソッドをカバーしようとしましたが、成功しませんでした。また、たとえば、 MyClass.MyTableModel の setValueAt() メソッドを単純に呼び出そうとしました。

MyClass.MyTableModel.setValueAt("valueChange", 0, 6);
MyClass.myTable.setModel(MyTableModel);
MyClass.myTable.repaint();

それもうまくいきません。私は自分のモデルに対して fireTableCellUpdated() を呼び出そうとしましたが (間違ったやり方であることはわかっています)、試みも失敗しました。あなたはなにか考えはありますか?

4

1 に答える 1

2

setValueAtメソッドをオーバーライドしません。デフォルトでは、このメソッドは何もしません。

例えば...

public void setValueAt(Object value, int row, int column) {
    List rowValues = date.get(row);
    rowValues.set(column, value);
    fireTableCellUpdated(row, col);
}

これは、すべての列が編集可能であることを前提としています。通常、入力値を調べて、指定された列の正しいタイプであることを確認し、必要な検証を適用しますが、それはあなたに任せます

また、いくつかの例としてテーブルの使用方法をご覧になることをお勧めします。

于 2013-10-02T21:41:07.300 に答える