【问题标题】:JavaFX 2.0 FXML Child WindowsJavaFX 2.0 FXML 子窗口
【发布时间】:2013-04-27 07:46:21
【问题描述】:

经过大量搜索,我发现了这个问题How to create a javafx 2.0 application MDI。我真正想知道的是我是否可以使用JavaFX组件和Scene Builder创建一个弹出窗口或子窗口到主窗口来创建新窗口。

我最终得到了一个模态弹出窗口:

在 Main 类中,我想将主阶段保存到我可以从主控制器类访问的字段中。所以,我在 Main.Start() 方法中添加了一个静态变量 Stage

primaryController.primaryStage = primaryStage;

这是primaryController中的按钮使用的方法:

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

这是我在 Scene Builder 的帮助下创建的 MessageBoxController 类。它具有标准弹出框的基本布局,可用于显示图标(ImageView)、TextBox(用于您的消息文本)和两个按钮(用于是/否功能)。我还不确定如何让它将按下哪个按钮的结果传达回主控制器。

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) {

}

}

最后,这是我在 Scene Builder 中创建的 FXML 文件:

<?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 中添加真正的支持之前,这是一个好方法吗?

【问题讨论】:

  • 您的解决方案很好。将“我以这个结束”之后的所有内容从问题中删除并将其添加为自我答案并将答案标记为正确。
  • 我明白了。我是 Java 新手,刚刚通过学习可用教程和进行谷歌搜索学习了 JavaFX。超出基础的信息不存在。因此,我不知道我发布的内容是否是解决问题的好方法,即使它似乎有效。如果这是一个好的解决方案,为什么没有其他人会想到这一点?我发现的只是其他不使用 JavaFX 的非常复杂的东西。
  • 大多数JavaFX message box solutions 只是普通的 Java 代码,而不是使用 FXML 进行布局。我提交了文档请求RT-27567 Create an official tutorial on how to create Common Application Dialogs
  • 其实上面的解决方法是行不通的。问题是 FXMLLoader 静态方法从 FXML 文件构建根控件并在其处理过程中创建控制器类的新实例,但无法获取它。我只是将控制器类与它的创建分开。现在它就像一个模态对话框一样工作,您可以获得按下哪个按钮的结果。
  • 发布您更正的解决方案作为答案 - 分享知识是该网站的目的。见Should I not answer my own questions?

标签: java javafx-2 fxml scenebuilder


【解决方案1】:

您是否尝试过使用 Group 类?您可以使用 fxml 和控制器添加不同的元素。

Group root= new Group(); 
AnchorPane frame=FXMLLoader.load(getClass().getResource("frame.fxml"));
AnchorPane  content=  FXMLLoader.load(getClass().getResource("principal.fxml"));
root.getChildren().add(window);
root.getChildren().add(frame);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2013-11-04
    • 2012-05-07
    • 2023-04-04
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多