Качающийся графический интерфейс:Прокрутка не обновляется, когда JTable становится больше
-
09-09-2019 - |
Вопрос
У меня есть графический интерфейс Java Swing, и возникла проблема с JTable
в JScrollPane
.По какой-то причине при увеличении строк модели таблицы во время выполнения программы JScrollPane
не обновляется - то есть, если строки увеличиваются так, что высота таблицы превышает высоту представления прокрутки, панели прокрутки не обновляются должным образом.(Новые строки отображаются на экране, как и ожидалось).Если размер окна изменяется, прокрутка обновляется, как и ожидалось.
Политика вертикальной прокрутки VERTICAL_SCROLLBAR_AS_NEEDED
, настольные модели fireTableDataChanged
называется..
К сожалению, код немного сложен, поэтому я не могу предоставить пример кода, вызывающий проблему.Но подумал спросить, есть ли у кого-нибудь четкие идеи..
РЕДАКТИРОВАТЬ: Еще немного запутаннее:политика горизонтальной прокрутки HORIZONTAL_SCROLLBAR_AS_NEEDED
, и если ширина таблицы превышает ширину представления (то есть используется горизонтальная полоса прокрутки), эта проблема не возникает...
РЕДАКТИРОВАТЬ2: Проблема не в том, что таблицу нужно прокручивать, а в том, что полосы прокрутки не активируются должным образом.
Решение 2
Хм..Вернувшись к проблеме, я обнаружил, что проблема связана с настройкой заголовка строки в JScrollPane.(Некоторые предпочтительные размеры были установлены с не очень разумными значениями и т. д.).
Другие советы
Возможно, вам придется опубликовать часть своего кода.Я только что провел следующий тест, и он работает так, как рекламируется, т.е.вертикальные полосы прокрутки активируются, когда количество строк превышает высоту области просмотра:
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.AbstractTableModel;
public class JTableTest {
public static void main(String[] args) {
final MyTableModel tm = new MyTableModel();
tm.addData(new Data("R1C1", "R1C2"));
JTable table = new JTable(tm);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
JFrame frame = new JFrame();
frame.setLayout(new GridLayout());
frame.add(scrollPane);
frame.pack();
frame.setSize(400, 150);
frame.setVisible(true);
Thread t = new Thread(new Runnable() {
private int count = 2;
public void run() {
for ( ; ; ) {
tm.addData(new Data("R" + count + "C1", "R" + count + "C2"));
count++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t.start();
}
private static class MyTableModel extends AbstractTableModel {
private List<Data> dataList = new ArrayList<Data>();
public int getColumnCount() {
return 2;
}
public void addData(Data data) {
dataList.add(data);
fireTableRowsInserted(dataList.size()-1, dataList.size()-1);
}
public int getRowCount() {
return dataList.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
Data data = dataList.get(rowIndex);
return columnIndex == 0 ? data.data1 : data.data2;
}
}
private static class Data {
public String data1;
public String data2;
public Data(String data1, String data2) {
this.data1 = data1;
this.data2 = data2;
}
}
}