当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX FXML应用程序中打开一个附加窗口?

隗俊誉
2023-03-14

在我的JavaFX FXML应用程序中,我希望当用户单击主窗口中的某个菜单项时弹出一个辅助窗口,这样用户就可以在其中输入一些输入,然后在单击按钮时将这些输入提供给应用程序,并且辅助窗口将被关闭。

所有的教程都有点离谱。它们描述了如何在纯JavaFX中实现这一点,这显然不同于您在FXML中使用的方式,或者它们解释了如何切换场景,这将关闭旧场景。我想这应该很简单,可以定义FXML布局及其控制器,用它们创建一个新场景,然后调用类似于

theStage.showScene(userInputWindow);

但一个可行的解决方案似乎要复杂得多,其背后的推理与我的假设不同。例如,在本教程中,我真的不明白他们为什么要将强制转换放入其中,FXMLLoader()实际上会做什么,或者我应该如何将这些转换调整到手头的任务中。此外,资源声明“舞台一次只能显示1个场景”。在我看来,JavaFX应用程序几乎不可能缺少显示新窗口而不关闭旧窗口这样的琐碎功能。也许我误解了什么是一个舞台和一个场景,他们能做什么。所以我需要知道:

>

  • 如何在代码中实现上面描述的效果?

    解决方案背后的理由是什么;所有涉及到的东西在那里都是做什么的?

  • 共有1个答案

    云弘壮
    2023-03-14

    阶段中只能显示一个场景,但可以创建多个阶段。如果您希望在辅助窗口中使用fxml,那么您应该使用controller实例,并以允许访问用户输入的方式设计controller。可以使用stage.showandwait“等待用户完成输入”。

    注意,这里只是一个打开新窗口的按钮,但是您可以在菜单项的onaction事件处理程序中使用类似的逻辑。(您需要使用someNode.GetScene().GetWindown()来访问Stage.InitOwner的父窗口(在这种情况下);someNode是父窗口中的任意节点;您可以从事件(((node)event.GetTarget()))获取节点,也可以使用您知道在场景中的节点;在InputController.SubmitMealField中用于此目的)

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Choose favorite meal");
    
        Label label = new Label("I don't know your favorite meal yet!");
    
        btn.setOnAction((ActionEvent event) -> {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("input.fxml"));
            Scene newScene;
            try {
                newScene = new Scene(loader.load());
            } catch (IOException ex) {
                // TODO: handle error
                return;
            }
    
            Stage inputStage = new Stage();
            inputStage.initOwner(primaryStage);
            inputStage.setScene(newScene);
            inputStage.showAndWait();
    
            String meal = loader.<InputController>getController().getMeal();
    
            label.setText(meal == null ? "C'mon, tell me your favourite meal already!" : "Your favourite meal is "+meal+". Interesting!");
        });
    
        VBox root = new VBox(label, btn);
        root.setSpacing(10);
        root.setPadding(new Insets(10));
        root.setPrefWidth(300);
    
        Scene scene = new Scene(root);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    public class InputController {
        @FXML
        private TextField mealField;
        private boolean mealChosen;
    
        @FXML
        private void submit() {
            mealChosen = true;
            mealField.getScene().getWindow().hide();
        }
    
        public String getMeal() {
            return mealChosen ? mealField.getText() : null;
        }
    
    }
    
    <GridPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mypackage.InputController" vgap="10" hgap="10"  >
      <columnConstraints>
        <ColumnConstraints prefWidth="150.0" />
        <ColumnConstraints prefWidth="150.0" />
      </columnConstraints>
       <children>
          <TextField GridPane.columnIndex="1" fx:id="mealField" onAction="#submit" />
          <Button mnemonicParsing="false" text="Ok" GridPane.columnIndex="1" GridPane.rowIndex="1" onAction="#submit" />
          <Label text="Your favourite meal" />
       </children>
       <padding>
          <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
       </padding>
    </GridPane>
    
     类似资料:
    • 问题内容: 我已经制作了一个简单的JavaFX应用程序,但是当用户单击按钮时,我希望主窗口打开一个辅助窗口。 最简单的方法是什么? 问题答案:

    • 问题内容: 我有一个netbeans Java应用程序,该应用程序在启动时应显示JFrame(StartUpWindow类扩展为JFrame类),并带有一些选项,然后用户单击一个按钮,然后关闭JFrame并打开一个新的(MainWindow类)。 因此,我该如何正确执行此操作。我显然在StartupWindow中的按钮上设置了一个单击处理程序,但是我应该在该处理程序中添加什么以便关闭StartUp

    • 如果这在Flutter中很难实现,有没有人可以为这个功能建议一些其他的语言或代码? 谢谢!!

    • 问题内容: 当您运行/调试它们时,是否可以将eclipse配置为在新窗口中打开控制台应用程序而不是其自己的控制台? 我正在调试客户端/服务器应用程序,我想一次看到两个应用程序的输出,而不必在选项卡之间切换… 问题答案: 在eclipse中,您可以有两个控制台视图…在控制台视图上,您​​有一个名为“打开控制台”的按钮(控制台视图中最右边的按钮)。如果单击此按钮并选择选项3(新控制台视图),将看到两个

    • 我下载了New Relic 2.12.0,并根据Heroku java配置文档对其进行了配置。 我将包内容解压缩到spring mvc应用程序目录的根目录,如下图所示 接下来,我将新文件推送到Heroku: 最后,我启动了new relic代理: 之后,我的应用程序失败,出现以下错误,似乎无法找到newrelic.jar文件。 new relic文档说JVM参数(例如-javaagent:newr

    • 我正在使用(Webdriver)驱动程序。关闭(关闭浏览器,而不是使用driver.quit)。关闭浏览器窗口后,我无法使用驱动程序。get(url)-引发无法访问的BrowserException。 作为一项工作,我试图得到windowHandles.size(),当它是零我想打开一个新的空白窗口,然后使用driver.get(url)。 但我找不到在Webdriver类中打开空白窗口的方法。