JavaFX 2.0 FXML Child Windows

Nach langem Suchen habe ich diese Frage gefundenSo erstellen Sie eine Javafx 2.0-Anwendung MDI. Ich wollte unbedingt wissen, ob ich mit JavaFX-Komponenten und Scene Builder ein Popup-Fenster oder ein untergeordnetes Fenster für das Hauptfenster erstellen kann, um das neue Fenster zu erstellen.

Am Ende habe ich ein modales Popup-Fenster erstellt:

In der Hauptklasse wollte ich die Primärstufe in einem Feld speichern, auf das ich von meiner Primärsteuerklasse aus zugreifen kann. Also habe ich eine statische Variable hinzugefügtBühne dazu und dazu in derMain.Start () Methode:

primaryController.primaryStage = primaryStage;

Dies ist die Methode, die eine Schaltfläche im primaryController verwendet:

public void OnBtnShowChild(ActionEvent event) {
    MessageBoxController msgBox = new MessageBoxController();
    try {
        msgBox.showMessageBox(primaryStage);
    } catch (Exception e) {
        e.printStackTrace(); 
    }
}

Dies ist die MessageBoxController-Klasse, die ich mit Hilfe von Scene Builder erstellt habe. Es hat das grundlegende Layout eines Standard-Popup-Fensters, in dem ein Symbol (ImageView), ein Textfeld (für Ihren Nachrichtentext) und zwei Schaltflächen (für die YES / NO-Funktion) angezeigt werden können. Ich bin mir noch nicht sicher, wie es die Ergebnisse des zurückgedrückten Buttons an den primaryController übermitteln soll.

public class MessageBoxController implements Initializable {

@FXML
// fx:id="btnNo"
private Button btnNo; // Value injected by FXMLLoader

@FXML
// fx:id="btnYes"
private Button btnYes; // Value injected by FXMLLoader

@FXML
// fx:id="imgMessage"
private ImageView imgMessage; // Value injected by FXMLLoader

@FXML
// fx:id="txtMessage"
private TextField txtMessage; // Value injected by FXMLLoader

private Stage myParent;
private Stage messageBoxStage;

public void showMessageBox(Stage parentStage) {
    this.myParent = parentStage;

    try {
        messageBoxStage = new Stage();
        AnchorPane page = (AnchorPane) FXMLLoader.load(MessageBoxController.class.getResource("/MessageBox/MessageBoxFXML.fxml"));
        Scene scene = new Scene(page);
        messageBoxStage.setScene(scene);
        messageBoxStage.setTitle("Message Box");
        messageBoxStage.initOwner(this.myParent);
        messageBoxStage.initModality(Modality.WINDOW_MODAL);
        messageBoxStage.show();
    } catch (Exception ex) {
        System.out.println("Exception foundeth in showMessageBox");
        ex.printStackTrace();
    }
}
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle arg1) {
    txtMessage.setText("Howdy");

}

public void OnBtnYes(ActionEvent event) {

}

public void OnBtnNo(ActionEvent event) {

}

}

Und schließlich ist dies die FXML-Datei, die ich in Scene Builder erstellt habe:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane2" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"   
      prefHeight="172.0" prefWidth="524.0" xmlns:fx="http://javafx.com/fxml" fx:controller="MessageBox.MessageBoxController">
  <children>
    <VBox prefHeight="172.0" prefWidth="524.0" styleClass="vboxes" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
      <children>
        <HBox alignment="CENTER" prefHeight="109.99990000000253" prefWidth="516.0" spacing="30.0">
          <children>
            <ImageView fx:id="imgMessage" fitHeight="110.0" fitWidth="146.66666666666666" pickOnBounds="true" preserveRatio="true" styleClass="null" />
            <TextField fx:id="txtMessage" editable="false" prefHeight="47.0" prefWidth="325.0" />
          </children>
          <stylesheets>
        <URL value="@MyCSS.css" />
      </stylesheets>
    </HBox>
    <HBox alignment="CENTER" prefHeight="58.0" prefWidth="516.0" spacing="30.0">
      <children>
        <Button fx:id="btnYes" mnemonicParsing="false" onAction="#OnBtnYes" text="Button" />
        <Button fx:id="btnNo" mnemonicParsing="false" onAction="#OnBtnNo" text="Button" />
      </children>
    </HBox>
  </children>
  <stylesheets>
    <URL value="@MyCSS.css" />
  </stylesheets>
</VBox>
</children>
<stylesheets>
<URL value="@MyCSS.css" />
</stylesheets>
</AnchorPane>

Hiermit kann ich ein modales Popup-Fenster erstellen, und ich möchte auch andere untergeordnete Fenster erstellen, um Daten mithilfe verschiedener Steuerelemente auf andere Weise anzuzeigen. Und am wichtigsten ist, dass ich Scene Builder verwenden kann, um das Layout zu erstellen.

Was denkst du? Ist dies eine gute Möglichkeit, um dies zu tun, bis sie echte Unterstützung in Java 8 und JavaFX 8 hinzufügen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage