Hallo,
ich versuche derzeit eine JTable zu erzeugen, mit 5 Spalten, jede Spalte hat eine minimale Breite gesetzt.
das Frame hat eine Breite von 400 am Anfang.
gewünschtes Verhalten wäre dies:
soweit funktioniert auch einiges, nur hänge ich derzeit an dem Problem wenn eine Spalte im Header der Tabelle verbreitert wurde so dass ein Scrollbalken erscheint und man dann das Frame verbreitert (größer als die gesamte Breite der Tabelle), werden die Spalten nicht mehr verbreitert automatisch obwohl JTable.AUTO_RESIZE_ALL_COLUMNS gesetzt wird.
hat jemand für solch ein Problem eine Lösung parat oder weiß wo man da ansetzen kann?
ich versuche derzeit eine JTable zu erzeugen, mit 5 Spalten, jede Spalte hat eine minimale Breite gesetzt.
das Frame hat eine Breite von 400 am Anfang.
gewünschtes Verhalten wäre dies:
- ist die Summe der minimalen Spaltenbreite < der Framebreite soll ein AutoResize aller Spalten durchgeführt werden ala JTable.AUTO_RESIZE_ALL_COLUMNS
- ist die Summe der minimalen Spaltenbreite > der Framebreite soll der Scrollbalken angezeigt werden (Änderung kann entweder duch verkleinerung / vergrößerung des Frame geschehen oder durch Änderung der Splatenbreite im Header der Tabelle)
- ist ein Scrollbalken vorhanden und wird das Frame vergrößert soll der Scrollbalken unter den obigen Bedingungen verschwinden oder angezeigt werden und beim verschwinden dann die Tabelle verbreitert werden wie bei JTable.AUTO_RESIZE_ALL_COLUMNS
- ist kein Scrollbalken vorhanden soll auch wenn die Spalte manuell verbreitert wurde diese proportional mit geändert werden, als wenn diese Spalte eine neue minimale Breite hätte
Java:
package com.salt;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class Test extends JFrame {
JTable jt = new JTable(20, 5);
public Test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Container content = getContentPane();
content.add(new JScrollPane(jt), BorderLayout.CENTER);
jt.getTableHeader().addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
final Container tableParent = jt.getParent();
if (tableParent instanceof JViewport) {
final int oldMode = jt.getAutoResizeMode();
if (tableParent.getSize().getWidth() < jt.getPreferredSize().getWidth()) {
if (oldMode != JTable.AUTO_RESIZE_OFF) {
jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
} else {
if (oldMode != JTable.AUTO_RESIZE_ALL_COLUMNS) {
jt.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
}
}
}
}
});
setSize(400, 400);
for (int col = 0; col < jt.getModel().getColumnCount(); col++) {
jt.getColumnModel().getColumn(col).setMinWidth(50);
}
setVisible(true);
}
public static void main(final String[] args) {
new Test();
}
}
soweit funktioniert auch einiges, nur hänge ich derzeit an dem Problem wenn eine Spalte im Header der Tabelle verbreitert wurde so dass ein Scrollbalken erscheint und man dann das Frame verbreitert (größer als die gesamte Breite der Tabelle), werden die Spalten nicht mehr verbreitert automatisch obwohl JTable.AUTO_RESIZE_ALL_COLUMNS gesetzt wird.
hat jemand für solch ein Problem eine Lösung parat oder weiß wo man da ansetzen kann?