In den meisten Fällen bevorzuge ich Tabellen, deren Spalten sich gleichmäßig über die vorhandene Breite verteilen. In JavaFX gibt es zwar die TableColumn, jedoch gibt es hier ersteinmal nur die Möglichkeit, feste Breiten für die Spalten einzustellen. Mit den folgenden Lösungen können die Spalten auch relative Breiten annehmen.
1. Lösung: Eigene Klasse
Die erste Lösung basiert auf dem folgenden Artikel: TableView: column’s width using percentage in JavaFX.
Es wird eine eine von TableColumn abgeleitete Klasse CustomTableColumn erstellt, die durch die Eigenschaft percentageWidth Einfluss auf die prozentuale Breite der Spalte nimmt. Zulässig sind Werte zwischen 0.0 und 1.0.
public class CustomTableColumn extends TableColumn {
private final DoubleProperty percentageWidth = new SimpleDoubleProperty( 1 );
public CustomTableColumn( ) {
tableViewProperty( ).addListener( new ChangeListener>( ) {
@Override
public void changed( final ObservableValue extends TableView> ov, final TableView t,
final TableView t1 ) {
if (CustomTableColumn.this.prefWidthProperty( ).isBound( )) {
CustomTableColumn.this.prefWidthProperty( ).unbind( );
}
CustomTableColumn.this.prefWidthProperty( ).bind( t1.widthProperty( ).multiply( percentageWidth ) );
}
} );
}
public final DoubleProperty percentageWidthProperty( ) {
return this.percentageWidth;
}
public final double getPercentageWidth( ) {
return this.percentageWidthProperty( ).get( );
}
public final void setPercentageWidth( final double value ) throws IllegalArgumentException {
if ((value >= 0) && (value <= 1)) {
this.percentageWidthProperty( ).set( value );
} else {
throw new IllegalArgumentException( String.format(
"The provided percentage width is not between 0.0 and 1.0. Value is: %1$s", value ) );
}
}
}
In einer FXML-Datei kann dann diese neue Klasse wie folgt eingesetzt werden:
2. Lösung: Einstellung
Eine nicht sofort offensichtliche Einstellung der Klasse TableView
kann genutzt werden, um die Spalten gleichmäßig über die Breite der Tabelle zu verteilen. Bei der Einstellung handelt es sich um die Funktion setColumnResizePolicy
, die mit der Konstante CONSTRAINED_RESIZE_POLICY
aufgerufen wird. Hier ein Beispiel:
TableView table = new TableView();
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY)
Ab JavaFX 2.2 kann dieses Verhalten auch in FXML ungesetzt werden. Hierzu wird die neue Anweisung fx:constant
verwendet: