2016-12-25 10 views
2

Gibt es eine bevorzugte Möglichkeit, (kleine) Änderungen an einer GUI in javaFX vorzunehmen? Ich bevorzuge die Verwendung von FXML, anstatt es programmgesteuert zu machen.Wie man minimale Änderungen an der GUI in javaFX anwendet

Zum Beispiel: Die Anwendung startet mit einem Hintergrund und einigen Schaltflächen in einer VBox (sie sind angeordnet wie in einer FXML-Datei definiert).

Nehmen wir an, dass ein Benutzer eine Schaltfläche drückt (z. B. in einem Spiel heißt die Schaltfläche "Multiplayer"), so dass die GUI geändert werden muss, um den nächsten Schritt anzuzeigen.

In diesem Beispiel möchte ich erreichen, dass die Schaltfläche etwas anderes benannt wird, eine andere Schaltfläche durch ein Textfeld ersetzt wird und möglicherweise einige andere kleine Änderungen angewendet werden. Der Großteil der GUI bleibt jedoch gleich, z. der Hintergrund, die VBox selbst und einige Tasten.

Sollte ich diese Änderungen programmgesteuert mit etwas wie vbox.getChildren().remove(button); und vbox.getChildren().add(textField); anwenden? Aber warum benutzt man dann FXML? Ich könnte die gesamte GUI programmatisch tun, anstatt nur die Start-fxml-Szene zu laden und dann Änderungen programmgesteuert anzuwenden.

Oder sollte ich eine neue Szene aus einer anderen FXML-Datei laden, wo diese Änderungen in der FXML-Datei vorgenommen werden. Aber dann merke ich, dass meine Anwendung lange braucht, um die neue FXML-Datei über FXMLLoader zu laden und für kurze Zeit einen weißen Bildschirm anzeigt.

Oder sollte ich meine FXML-Datei in verschiedene Schichten teilen, damit ich z. Tauschen Sie die VBox nur gegen eine andere VBox, anstatt die gesamte GUI zu ersetzen? Aber wie sollte ich meine GUI dann strukturieren, und kann ich SceneBuilder noch verwenden?

Wahrscheinlich sind alle meine Wege nicht die bevorzugten. Wie kann ich mein Ziel gut erreichen?

Wenn Sie sich meinen aktuellen Code ansehen möchten, habe ich ihn früher in this thread gepostet.

+0

ich die Ansichten als die kleinsten einzelnen Komponenten definieren würde, und wenn so etwas, was Sie beschrieben geschieht, tauschen Teile der Ansicht mit einem anderen. Nehmen wir an, Sie haben eine 'MainButtons' und eine' MultiplayerButtons' Komponente. Sobald Sie den Multiplayer-Btn auf main geklickt haben, wechseln Sie einfach main zu multi. –

+0

Also ist Ihr Vorschlag, eine eigene fxml-Datei für jede Komponente wie eine Schaltfläche zu haben? Oder habe ich das falsch verstanden? Und wie kann ich meine komplette GUI aus diesen Dateien erstellen? – Yakuhzi

+0

Für den Textwechsel ist der bevorzugte Weg die Verwendung eines Controllers. Entfernen sollte auch dort gemacht werden, aber es ist ein wenig komplizierter. – Mordechai

Antwort

1

Anstatt einen Button oder einen TextField in der fxml zu definieren, definieren Sie dort einen Container, zum Beispiel einen Pane. Dann ändern, was in diesem Pane in Ihrem Controller sein muss:

@FXML 
private Pane flexiblePane; 

private Button myButton = new Button(); 
private TextField myTextField = new TextField(); 


private void displayFlexiblePaneAsButton(boolean flag) { 
    if (flag) { 
     flexiblePane.getChildren().clear(); 
     flexiblePane.getChildren().add(myButton); 
    } 
    else { 
     flexiblePane.getChildren().clear(); 
     flexiblePane.getChildren().add(myTextField); 
    } 
} 
Verwandte Themen