2010-10-24 5 views
0

Для пользовательской TableModel, я переопределяю isCellEditable, который всегда возвращается true.JTable cell не отражает изменения, хотя редактируется

Я также переопределяю setValueAt, но не знаю, как использовать этот метод, так что JTable отражает изменения, сделанные путем редактирования.

Ниже приведен модифицированный код для PersonTableModel: -

class PersonTableModel extends AbstractTableModel{ 

    public int getRowCount(){ 
     return 10 ; 
    } 

    public int getColumnCount(){ 
     return 1 ; 
    } 

    public String getColumnName(int c){ 
     return "Name" ; 
    } 

    public Object getValueAt(int r, int c){ 
     return "Person " + ++r ; 
    } 

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

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     //what goes here 
    } 
} 

С уважением, Rits


Edit:

По предложению членов формы, ниже код, где я с использованием PersonTableModel: -

public class CustomTableModel{ 

    @SuppressWarnings("deprecation") 
    public static void main(String[] args){ 
     JFrame frame = new PersonFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; 
     frame.show(); 
    } 
} 

class PersonFrame extends JFrame{ 

    @SuppressWarnings("deprecation") 
    public PersonFrame(){ 
     setTitle("PersonTable"); 
     setSize(600, 300); 

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

     getContentPane().add(new JScrollPane(table), "Center") ; 
     show() ; 
    } 
} 
+0

Thanx camickr :) – mogli

ответ

1

Расширение модели DefaultTableModel, а затем вам необходимо переопределить метод isCellEditable (...). Модель таблицы по умолчанию уже реализует метод setValueAt() в дополнение к другим полезным методам.

Если вы действительно хотите знать, что входит в метод setValueAt (...), посмотрите на исходный код для DefaultTableModel, чтобы узнать, как setValueAt() уведомляет представление, которое изменила модель, вызвав соответствующий fireXXX метод.

+0

Я изменил «класс PersonTableModel extends AbstractTableModel» на «класс PersonTableModel extends DefaultTableModel», а также удалил метод setValueAt из моего класса PersonTableModel. Но, кроме того, изменения не отражаются. – mogli

+0

Тогда у вас есть еще одна проблема с вашим кодом. Вот почему вы должны начать с создания SSCCE (http://sscce.org). Затем вы можете опубликовать SSCCE, если у вас есть проблемы. – camickr

+0

Я обновил сообщение, как и предложил. :-) – mogli

1

Ваша первая версия PersonTableModel уже очень близка, я бы сказал. Я предполагаю, что вы хотите иметь таблицу с одним столбцом с заголовком «Имя», а затем в каждой строке имя, редактируемое.
Причина, по которой ваши изменения не отображаются, заключается в том, что у вас нет базовой структуры данных для их сохранения. Я бы предложил добавить String Array для сохранения имен. Тогда код для TableModel должен выглядеть следующим образом:

class PersonTableModel extends AbstractTableModel{ 

String[] data; 

// I would add a constructor which fills the column initially with the 
// values you want to have. Like "Person 1" "Person 2" and so on. 
// You can also think about passing a size value here which determines 
// the capacity of the table and therefore also the rows in the table. 
// (But this would require you to change the getRowCount method). 
public PersonalTableModel(){ 
    data = new String[10] 
    for(int i = 0; i<10; i++){ 
     data[i] = "Person "+i; 
    } 
} 


public int getRowCount(){ 
    return 10 ; 
} 

public int getColumnCount(){ 
    return 1 ; 
} 

public String getColumnName(int c){ 
    return "Name" ; 
} 

// Since you dont have multiple columns you only need to pass the row here 
public Object getValueAt(int r){ 
    // Simply get the corresponding String out of the data array 
    return data[r]; 
} 

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

// Here you also dont need to pass the column index 
public void setValueAt(Object aValue, int rowIndex) { 
    // Save the new name into the array 
    data[rowIndex] = aValue.toString(); 
} 

}

Надеется, что это помогает.