Как обновить JTable на JScrollPane

как и многие другие люди, я хочу, чтобы мой JTable актуализировался после добавления строк. Здесь вы можете увидеть фрагменты моего кода.

ArrayList<> foundR = new ArrayList<FoundResult>();

JTable resultsTable = new JTable();
AbstractTableModel resultsModel = new FoundResultTableModel(foundR);//<- model which contains FoundResults as rows
JScrollPane scroller = new JScrollPane();

resultsTable.setModel(resultsModel);
scroller.add(resultsTable);
this.add(scroller, BorderLayout.CENTER);// a big panel which contains scroller and other components

Затем добавьте ActionListener, который использует следующий метод:

foundR.clear();
foundR.addAll( ...);//<- so the foundR ArrayList is refreshed
resultsModel.fireTableDataChanged();
resultsModel.fireTableStructureChanged();

rowCount результатов Модель показывает, что модель обновилась (количество строк отличается от предыдущего варианта), но таблица по-прежнему не отображается. Я попытался вставить resultsTable.repaint(), но это тоже не помогло.

UDP(NB) Я обнаружил, что проблема сосредоточена в этой панели скроллера.

Если я добавляю таблицу непосредственно на большую панель, она обновляется (но я не вижу всех результатов, так как не могу прокрутить вниз)

 this.add(resultsTable, BorderLayout.CENTER); 

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


person user2957954    schedule 12.05.2014    source источник
comment
Показать код FoundResultTableModel.   -  person alex2410    schedule 12.05.2014
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный и проверяемый пример).   -  person Andrew Thompson    schedule 12.05.2014
comment
Что произойдет, если вы прокрутите до конца JTable в своей программе, а затем добавите строки?   -  person Gilbert Le Blanc    schedule 12.05.2014


Ответы (2)


Добавьте это в свой код,

resultsTable.revalidate();

Поскольку ваша модель была изменена, но об изменении модели также следует сообщить в таблицу.

person Aditya    schedule 12.05.2014

Просто воссоздайте модель и установите ее на свой стол.

foundR.clear();
foundR.addAll( ...);//<- so the foundR ArrayList is refreshed
AbstractTableModel resultsModel = new FoundResultTableModel(foundR);
resultsTable.setModel(resultsModel);
person StanislavL    schedule 12.05.2014
comment
Я обнаружил, что проблема вызвана скроллером (JScrollPane). - person user2957954; 12.05.2014