Обновить графический интерфейс таблицы, который расширяет пользовательский AbstractTableModel - PullRequest
0 голосов
/ 09 февраля 2011

Я создал графический интерфейс Java, который отображает таблицу с использованием следующего синтаксиса:

table = new JTable(new MyTableModel(columnNames,
                                    updateTable(cmbAdversary.getSelectedItem().toString(),
                                                cmbdataType.getSelectedItem().toString())));

, где columnNames - вектор строк cmbadversary, а smbdataType - поля со списком выбора.

updateTable - это метод, который возвращает вектор векторов в зависимости от выбора поля со списком следующим образом:

static Vector updateTable(String FilterVal1 , String FilterVal2) 
{
try {
    myVector = tssc.testSeverityFunctionService(FilterVal1,FilterVal2);
} catch (Exception e) {
e.printStackTrace();}
return myVector;
}

Так выглядит мой пользовательский класс MyTableModel, расширяющий AbstractTableModel:

class MyTableModel extends AbstractTableModel 
{
    Vector columnNames = new Vector();
    Vector Fdb = new Vector();

    public MyTableModel(Vector cName,Vector rName){
        this.columnNames = cName;
        this.Fdb = rName;}
    public int getColumnCount() { // number of columns in the model.
        return columnNames.size();
    }
    public int getRowCount() { // number of rows in the model.
        return Fdb.size();
    }
    @Override
    public String getColumnName(int col) {
        return columnNames.get(col).toString();
    }
    public Object getValueAt(int row, int col) {
        Vector v = (Vector) this.Fdb.get(row);
        return v.get(col);
    }
    @Override
    public Class getColumnClass(int c) {
        Vector v = (Vector) Fdb.get(0);
        return v.get(c).getClass();}

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

    public void setValueAt(Vector value, int row, int col) 
    {
        for(int i=0;i<value.size();i++)
        { for(int j=0;j<columnNames.size();j++) {
                    Fdb.setElementAt(value.get(j),j);   }
        }
        fireTableCellUpdated(row, col);
    }

}

Проблема в том, что когда я запускаю код, таблица GUI показывает мне начальные значения, но не обновляется, когда я изменяю выбор в 2 выпадающих списках и нажимаю кнопку выбора.Кстати, кнопка «Выбор» вызывает метод, который реализует прослушиватель действий.

Пожалуйста, помогите мне.Я не профессионал в Java, но готов учиться.Если у вас есть какие-либо вопросы, я с радостью предоставлю вам подробности.

1 Ответ

1 голос
/ 09 февраля 2011

Ваше решение кажется слишком сложным.Если я понимаю основы, пользователь выбирает значение из поля со списком, а затем на основе выбора некоторые данные загружаются в таблицу.

Для этого не нужно создавать пользовательскую модель таблицы.

TableModel содержит данные.Если вы хотите изменить данные, то один из способов сделать это - просто создать новую TableModel.Таким образом, вы добавляете ActionListener в ваше поле со списком.Когда элемент выбран, вы извлекаете свои данные и загружаете данные в вектор или массив.Используя эти данные, вы можете создать новый TableModel и обновить JTable в двух строках кода:

DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );

Если вам нужно настроить модель для переопределения методов getColumnClass () или isCellEditable (), то вам следуетрасширить DefaultTableModel.Я не вижу необходимости реализовывать всю модель.

...