Aktivieren der automatischen Größenänderung von JTable nur, wenn es zum Ansichtsfenster passt

Ich muss eine JTable in JScrollPane mit anpassbaren Spalten erstellen (wenn der Benutzer die Spaltenbreite erhöht - horizontale Bildlaufleiste wird angezeigt). Dafür habe ich Verwendungtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);. Wenn das Ansichtsfenster breit genug ist, um die gesamte Tabelle aufzunehmen, sollten sich die Spalten dehnen, um die Breite des Ansichtsfensters auszufüllen. Um dies zu erreichen, muss ich überschreibengetScrollableTracksViewportWidth() Methode der JTable-Klasse wie folgt:

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

Dieser Ansatz funktioniert gut, abgesehen von einer Sache: Wenn ich zum ersten Mal versuche, die Größe der Spalte zu ändern, wird die eigene Breite auf die Startposition zurückgesetzt. Wenn ich die Spaltengröße schnell ändere und die Maustaste loslasse, funktioniert die Tabelle weiterhin gut. Was ist der Grund für ein solches Verhalten? Warum Tabelle versuchen, die Größe zu ändern, auch wenngetScrollableTracksViewportWidth() Gibt false zurück? Oder können Sie vielleicht eine bessere Lösung für die Implementierung eines solchen Größenänderungsmodus vorschlagen?

Der folgende Text ist ein einfaches Arbeitsbeispiel für das obige Problem:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage