2013-10-02 2 views
0

Я использую AbstractTableModel для моего JTable.Изменение данных в определенной ячейке JTable

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(), но без успеха. Кроме того, я попытался просто вызвать метод setValueAt() для MyClass.MyTableModel, например:

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

Это также не работает. Я попытался вызвать fireTableCellUpdated() для моей модели (я знаю, что это неправильная практика), но она также не удалась. У тебя есть идеи?

+0

Для более эффективной помощи следует отправить сообщение [SSCCE] (http://sscce.org/). –

+0

Для повышения удобочитаемости используйте правильную заглавную букву для имен переменных; переменные должны начинаться с небольшой буквы, в отличие от «MyClass» и ее поля «MyClass.MyTable». «Не работает» - не очень полезное описание ошибки. –

+0

@ AndrewThompson, я запомню, спасибо, сэр. Господин его, как я могу лучше описать ситуацию, когда обновление данных не работает, и я не знаю почему? Если бы я знал, почему этого не будет. – bluevoxel

ответ

2

Вы не переопределяете метод setValueAt. По умолчанию этот метод ничего не делает.

Например ...

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

Это предполагает, что все столбцы являются изменяемыми. Обычно я проверял входящее значение, чтобы убедиться, что оно было правильным типом для указанного столбца и применимо к тому, что может потребоваться для проверки, но я оставлю это до вас.

Возможно, вам также понравится посмотреть на How to use tables, который в качестве примера

+0

Я не пытался получить целые данные о строках в списке ... Ваше решение отлично работает. Спасибо, сэр! – bluevoxel

+0

@eLogic Приятно видеть, что что-то работало сегодня;) – MadProgrammer