Мне нужно создать JTable внутри JScrollPane с изменяемым размером столбцов (когда пользователь увеличивает ширину столбца - появляется горизонтальная полоса прокрутки). Для этого я использую table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
. Кроме того, когда область просмотра достаточно широка, чтобы содержать всю таблицу, столбцы должны растягиваться, чтобы заполнить ширину области просмотра. Для этого я переопределил метод getScrollableTracksViewportWidth()
класса JTable следующим образом:
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
Этот подход работает хорошо, за исключением одного: когда я впервые пытаюсь изменить размер столбца, он возвращает собственную ширину в начальное положение. Если я быстро изменю размер столбца и отпущу мышь, таблица продолжит работать нормально. Итак, в чем причина такого поведения? Почему таблица пытается изменить размер, даже если getScrollableTracksViewportWidth()
возвращает false? Или, может быть, вы можете предложить лучшее решение для реализации такого режима изменения размера?
Сильфон - простой рабочий пример вышеуказанной проблемы:
import javax.swing.*;
public class TestTable {
private static Object[][] data = new Object[][] {
{ "a", "b", "c" },
{ "d", "e", "f" }
};
private static Object[] colNames = new Object[] { "1", "2", "3" };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTable table = new JTable(data, colNames) {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
});
}
}