TableColumn mit prozentualer Breite

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> 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:

	
		
	

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.