Mein Anliegen ist es, eine Tabelle mit JTable zu erstellen, die sich frei in der Spaltenbreite einstellen lässt (AUTO_RESIZE_OFF). Aber gleichzeitig sollen die Spalten bei mehr Platz, als sie brauchen, automatisch mitwachsen.
Gefunden habe ich unzählige Vorschlage, eine Methode von JTable zu überschreiben gefunden:
Allerdings gibt dieser Ansatz nur schwer kontrollierbare Ergebnisse. Die Größe der Tabelle springt ständig hin und her.
Ich habe zwar etwas gefunden, dass mehr schlecht als recht funktioniert. Aber ich habe Hoffnung, das ihr mir auf die Sprünge helfen könnt.
Mein Versuch das ganze zu lösen:
Gefunden habe ich unzählige Vorschlage, eine Methode von JTable zu überschreiben gefunden:
Java:
public boolean getScrollableTracksViewportWidth(){
return !(autoResizeMode == AUTO_RESIZE_OFF && getPreferredSize().width >= getParent().getWidth());
}
Ich habe zwar etwas gefunden, dass mehr schlecht als recht funktioniert. Aber ich habe Hoffnung, das ihr mir auf die Sprünge helfen könnt.
Mein Versuch das ganze zu lösen:
Java:
final JFrame disp = new JFrame();
disp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
disp.setLocationByPlatform(true);
disp.setSize(600, 400);
final JTable table = new JTable(new String[][] {}, new String[]{....});
super(new String[][] {}, head);
table.setAutoResizeMode(AUTO_RESIZE_OFF);
final JScrollPane sp = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
disp.add(sp);
disp.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
int diff = table.getWidth() - sp.getViewport().getSize().width;
if (diff < 0) {
int add = Math.max(1, diff / table.getColumnCount());
int done = 0;
int index = getSmallest();
if (index >= table.getColumnCount()) {
index = 0;
}
while (done > diff) {
table.getColumnModel()
.getColumn(index)
.setPreferredWidth(
add
+ table.getColumnModel()
.getColumn(index)
.getPreferredWidth());
done -= add;
index++;
if (index >= table.getColumnCount()) {
index = 0;
}
}
}
}
private int getSmallest() {
int i, ret = 0, width = table.getColumnModel().getColumn(0)
.getPreferredWidth();
for (i = 0; i < table.getColumnCount(); i++) {
if (table.getColumnModel().getColumn(0).getPreferredWidth() < width) {
ret = i;
}
}
return ret;
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
table.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
int diff = table.getWidth() - sp.getViewport().getSize().width;
if (diff < 0) {
disp.setSize(disp.getWidth() + diff -1, disp.getHeight());
}
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
disp.setVisible(true);