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