2015-11-25 3 views
0

Я просто не могу получить свой JTable, чтобы обновить новую модель таблицы, которую я создаю с помощью метода.Невозможно получить JTable для обновления/перерисовки DefaultTableModel в том же экземпляре запуска GUI

Я доказал метод tablemodel.getDataVector(), что моя таблица модели обновлена ​​правильно.

Однако я не могу получить свой JTable, чтобы обновить представление к этой новой вещи.

My JTable находится на пустой панели макета и находится в пределах JScrollPane.

Соответствующий код о JTable:

private JTable patientTable = new JTable(tablemodel); 
     private JScrollPane patientscrollPane = new JScrollPane(patientTable);  
patientTable.setModel(tablemodel); 
    patientTable.setFillsViewportHeight(true); 
    sorter = new TableRowSorter<DefaultTableModel>(tablemodel); 
    patientTable.setRowSorter(sorter); 
    patientcard.add(patientscrollPane); 

Соответствующий код о том, что я пытаюсь сделать, чтобы перерисовать таблицу:

tablemodel = controller.createModel(patientlist);  
     patientTable = new JTable(tablemodel); 
     patientscrollPane = new JScrollPane(patientTable); 
     patientTable.setModel(tablemodel); 
     patientTable.setFillsViewportHeight(true);  
    patientTable.setPreferredScrollableViewportSize(patientTable.getPreferredSize()); 
     patientTable.validate(); 
     patientscrollPane.validate(); 
     patientTable.repaint(); 
     patientcard.setVisible(true); 
     registrycard.setVisible(false); 

Интересно, что когда я называю patientTable.getTableModel(), не возвращают DefaultTableModel

+3

Это, как правило, имело место для меня в прошлом, когда была предпринята попытка обновить модель за пределами Диспетчерской темы событий. Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+0

Спасибо. Теперь я добавил то, что, по моему мнению, является запущенным примером, с удаленным количеством строк кода и всего двумя полями для пациента (имя, фамилия) и т. Д. Вы также можете запустить это путем тестирования на любом образце CSV чего-либо с именем и фамилией. –

+0

@MadProgrammer Теперь я обновился, чтобы быть еще проще, посмотрите –

ответ

0

попытка вызова

tablemodel.fireTableDataChanged(); 

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

+0

Я пробовал это, но он не работает. –

+0

Вы никогда не должны вызывать методы fireXxx извне модели. Если вы используете соответствующие методы добавления/удаления/обновления, то это будет сделано автоматически – MadProgrammer

+0

@MadProgrammer Спасибо, я посмотрю на него :) – KimboKast

0

ОК, я публикую это с большим ликованием. Вся проблема заключалась в том, что я определял TableModel как DefaultTableModel, а не AbstractTableModel, переопределяя и создавая новые методы removeRow, addRow и insertList.

public void setList(ArrayList<Patient> patientlist) { 
     this.patientlist = patientlist; 
     fireTableDataChanged(); 
    } 

public void removeRow(int row) 
{ 
    patientlist.remove(row); 
    fireTableRowsDeleted(row, row); 
} 

public void addRow(Patient patient) { 
    patientlist.add(patient); 
    int row = patientlist.indexOf(patient); 
    for(int column = 0; column < patientlist.size(); column++) { 
     fireTableCellUpdated(row, column); 
    } 
    fireTableRowsInserted(row, row); 
} 

Я хотел бы предложить кого-либо, создавая любые пользовательские типы tablemodels из ArrayLists и т.д. всегда использовать AbstractTableModel.