Habilitar el cambio de tamaño automático de JTable solo si se ajusta a la ventana gráfica

Necesito crear una JTable dentro de JScrollPane con columnas de tamaño variable (cuando el usuario aumenta el ancho de la columna - aparece la barra de desplazamiento horizontal). Para esto tengo uso.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);. Además, cuando la ventana gráfica es lo suficientemente ancha como para contener una tabla completa, las columnas deben extenderse para llenar el ancho de la ventana gráfica. Para lograr esto tengo anulacióngetScrollableTracksViewportWidth() Método de la clase JTable como sigue:

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

Este enfoque funciona bien, excepto por una cosa: la primera vez que intento cambiar el tamaño de la columna, retorna el ancho propio a la posición inicial. Si rápidamente cambio el tamaño de la columna y suelto la tabla del mouse, continúo funcionando bien. Entonces, ¿cuál es la razón de tal comportamiento? ¿Por qué mesa intenta cambiar el tamaño incluso sigetScrollableTracksViewportWidth() devuelve falso? O, tal vez, ¿puede proponer una mejor solución para implementar dicho modo de cambio de tamaño?

A continuación se muestra un ejemplo simple de trabajo del problema anterior:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta