Как да опресните 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 of results Моделът показва, че моделът е обновен (броят на редовете се различава от предишния вариант), но таблицата все още не се появява. Опитах се да вмъкна 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