Włączanie automatycznej zmiany rozmiaru JTable tylko wtedy, gdy pasuje do rzutni

Muszę utworzyć JTable wewnątrz JScrollPane z kolumnami o zmienionym rozmiarze (gdy użytkownik zwiększy szerokość kolumny - pojawi się poziomy pasek przewijania). Do tego używamtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);. Ponadto, gdy rzutnia jest wystarczająco szeroka, aby pomieścić całą tabelę - kolumny powinny rozciągać się, aby wypełnić szerokość rzutni. Aby to osiągnąć, mam nadpisaniegetScrollableTracksViewportWidth() metoda klasy JTable:

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

To podejście działa dobrze, z wyjątkiem jednej rzeczy: kiedy po raz pierwszy próbuję zmienić rozmiar kolumny, zwraca własną szerokość do pozycji początkowej. Jeśli szybko zmienię rozmiar kolumny i zwolnisz tabelę myszy, nadal działaj dobrze. Jaka jest przyczyna takiego zachowania? Dlaczego tabela próbuje zmienić rozmiar, nawet jeśligetScrollableTracksViewportWidth() zwraca fałsz? A może możesz zaproponować lepsze rozwiązanie do wdrożenia takiego trybu zmiany rozmiaru?

Bellow to prosty przykład działania powyższego problemu:

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

questionAnswers(1)

yourAnswerToTheQuestion