Wie kann ich Elemente in meinem JavaFX Programm an die Fenstergröße anpassen?

1 Antwort

Die Elemente deines Fensters werden sich nicht responsive verhalten, gerade da du sie mit einem AnchorPane (bzw. fixen Größen und Koordinaten) anordnest.

Für ein adaptives/responsive Design wäre Folgendes zu beachten:

1) Verwende zur Anordnung Layout Panes wie BorderPane, GridPane, FlowPane, HBox, TilePane, VBox

2) Verzichte auf fixe Größen. Setze stattdessen eher nur Größenbereiche (z.B. Mindest-/Maximalbreite). Die präferierte Größe sollte sich an dem Inhalt ausrichten (Region.USE_COMPUTED_SIZE).

Du kannst über Constraints (siehe bspw. ColumnConstraints des GridPane) auch prozentuale Werte vorgeben oder im FXML die Werte entsprechend berechnen.

Beispiel:

<VBox fx:id="root" prefHeight="${screen.visualBounds.height}" prefWidth="${screen.visualBounds.width}">
  <fx:define>
    <Screen fx:factory="getPrimary" fx:id="screen" />
  </fx:define>
  <Label prefWidth="${root.width * 0.5}" />
</VBox>

Über die fx:factory wird die primäre Stage bezogen. Somit ist es möglich, die aktuelle Fenstergröße (visualBounds) zu ermitteln und auf dessen Grundlage die gewünschten Größen zu berechnen.

3) Was man aber auch berücksichtigen sollte: Es ist nicht unbedingt praktikabel, Elemente bei Skalierung der Fenstergröße automatisch größer/kleiner werden zu lassen. Wie bei responsive Webseiten sollte man stattdessen schauen, wie die Elemente je nach verfügbaren Platz am besten angeordnet werden.

Insofern könnte man sich auch ein eigenes Grid Layout bauen, welches bei verschiedenen Breakpoints Umbrüche erzeugt. In diesem Artikel wird die Implementation eines solchen Layout Managers gezeigt.