Habilitando o redimensionamento automático de JTable somente se couber na viewport

Eu preciso criar um JTable dentro JScrollPane com colunas redimensionáveis ​​(quando o usuário aumentar a largura da coluna - barra de rolagem horizontal aparece). Para isso eu tenho usotable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);. Além disso, quando a viewport é larga o suficiente para conter toda a tabela, as colunas devem esticar para preencher a largura da viewport. Para conseguir isso eu tenho overridegetScrollableTracksViewportWidth() método da classe JTable como segue:

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

Esta abordagem funciona bem, exceto uma coisa: quando eu pela primeira vez tentar redimensionar a coluna, retorne a própria largura para a posição inicial. Se eu rapidamente redimensionar coluna e soltar tabela do mouse continuar a funcionar bem. Então, qual é a razão de tal comportamento? Por que a tabela tenta redimensionar mesmo segetScrollableTracksViewportWidth() retorna falso? Ou, talvez, você possa propor uma solução melhor para implementar esse modo de redimensionamento?

Abaixo está um exemplo simples de trabalho do problema acima:

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