Potrzebuję utworzyć JTable wewnątrz JScrollPane z kolumny resizeable (gdy użytkownik zwiększa szerokość kolumny - pojawia się poziomy pasek przewijania). Do tego używam table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
. Ponadto, gdy okno robocze jest wystarczająco szerokie, aby zawierało całą tabelę - kolumny powinny rozciągać się, aby wypełnić szerokość rzutni. Aby to osiągnąć mam nadpisać getScrollableTracksViewportWidth()
metody JTable klasy następująco:Włączanie automatycznej zmiany rozmiaru JTable tylko jeśli pasuje do widoku
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
Podejście to działa dobrze, z wyjątkiem jednej rzeczy: kiedy po raz pierwszy spróbować zmienić rozmiar kolumny zwróci własne szerokości do pozycji wyjściowej. Jeśli szybko zmień rozmiar kolumny i zwolnij tabelę myszy, nadal działa dobrze. Jaki jest tego powód takiego zachowania? Dlaczego tabela próbuje zmienić rozmiar, nawet jeśli getScrollableTracksViewportWidth()
zwraca wartość false? A może, możesz zaproponować lepsze rozwiązanie do wdrożenia takiego trybu zmiany rozmiaru?
Poniżej prosty przykład działa od 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);
}
});
}
}
Doskonały, działa dobrze. – user2137020
Zobacz także: http://stackoverflow.com/questions/15499255/jtable-with-autoresize-horizontal-scrolling-and-shrinkable-first-column dla innej implementacji. – camickr
Działa jak urok! Jedyne rozwiązanie, które udało mi się doskonale. –