Включение автоматического изменения размера JTable, только если оно соответствует области просмотра

Мне нужно создать JTable внутри JScrollPane с изменяемыми размерами столбцов (когда пользователь увеличивает ширину столбца - появляется горизонтальная полоса прокрутки). Для этого у меня есть использованиеtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);, Кроме того, когда область просмотра достаточно широка, чтобы содержать всю таблицу - столбцы должны растягиваться, чтобы заполнить ширину области просмотра. Для этого у меня есть переопределениеgetScrollableTracksViewportWidth() метод класса JTable следующим образом:

@Override
public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
}

Этот подход работает хорошо, за исключением одного: когда я впервые пытаюсь изменить размер столбца, он возвращает собственную ширину в начальную позицию. Если я быстро изменю размер колонки и отпущу таблицу мыши, продолжу работать хорошо. Итак, в чем причина такого поведения? Почему таблицы пытаются изменить размер, даже еслиgetScrollableTracksViewportWidth() возвращает ложь? Или, может быть, вы можете предложить лучшее решение для реализации такого режима изменения размера?

Ниже приведен простой рабочий пример вышеуказанной проблемы:

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);
            }
        });
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос