JavaFX 2.0 FXML дочерних окон
После долгих поисков я нашел этот вопросКак создать MDI приложения javafx 2.0, Что я действительно хотел знать, так это то, что я могу создать всплывающее окно или дочернее окно для главного окна, используя компоненты JavaFX и Scene Builder для создания нового окна.
Я закончил с этим для модального всплывающего окна:
В основном классе я хотел сохранить первичную стадию в поле, к которому я могу получить доступ из своего основного класса контроллера. Итак, я добавил статическую переменнуюстадия к этому, и это вMain.Start () метод:
primaryController.primaryStage = primaryStage;
Этот метод используется кнопкой в primaryController:
public void OnBtnShowChild(ActionEvent event) {
MessageBoxController msgBox = new MessageBoxController();
try {
msgBox.showMessageBox(primaryStage);
} catch (Exception e) {
e.printStackTrace();
}
}
Это класс MessageBoxController, который я создал с помощью Scene Builder. Он имеет базовый макет стандартного всплывающего окна, которое можно использовать для отображения значка (ImageView), TextBox (для текста вашего сообщения) и двух кнопок (для функциональности ДА / НЕТ). Я еще не уверен, как заставить это сообщить результаты того, какая кнопка была нажата назад к primaryController.
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) {
}
}
И, наконец, это файл FXML, который я создал в Scene Builder:
<?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>
С помощью этого я могу создать модальное всплывающее окно, а также я хочу создать другие дочерние окна для отображения данных другими способами с использованием других элементов управления. И, самое главное, я могу использовать Scene Builder для создания макета.
Как вы думаете? Это хороший способ сделать это, пока они не добавят реальную поддержку в Java 8 и JavaFX 8?