在 JavaFX 中的窗格之间切换

2022-09-01 15:34:25

我正在尝试使用FXML在JavaFX中制作一个Java程序。但是,我在布局管理方面遇到了麻烦。我想在Panes之间切换,就像我习惯了摇摆中的CardLayout一样,但我似乎无法理解它。

我用谷歌搜索了一下,没有找到任何答案。

JavaFX中是否有任何等效的CardLayout?如果是这样,你能给我举个例子吗?这将对我的夜晚有很大帮助!

这是我的FXML代码

    <AnchorPane id="anchorPane" prefHeight="324.0" prefWidth="530.0" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxapplication2.SampleController">
  <children>
    <Pane fx:id="mainScreen" layoutX="6.0" prefHeight="324.0" prefWidth="518.0">
      <children>
        <Button layoutX="254.0" layoutY="37.0" mnemonicParsing="false" text="Button" />
      </children>
    </Pane>
    <Pane fx:id="loginScreen" prefHeight="324.0" prefWidth="530.0">
      <children>
        <TextField id="password" fx:id="username" layoutX="142.0" layoutY="106.0" prefWidth="200.0" />
        <TextField fx:id="password" layoutX="142.0" layoutY="140.0" prefWidth="200.0" />
        <Label fx:id="label" layoutX="126.0" layoutY="120.0" minHeight="16.0" minWidth="69.0" />
        <Button fx:id="button" layoutX="213.0" layoutY="196.0" onAction="#handleButtonAction" onKeyPressed="#handleButtonAction" text="Login" />
      </children>
    </Pane>
  </children>
</AnchorPane>

答案 1

非动画过渡

如果窗格之间不需要动画过渡,则可以:

  1. 通过创建新场景替换整个场景,并将该场景设置在舞台上,或者
  2. 通过从父布局中删除旧窗格并添加新窗格(通过操作父级的子窗格列表)来仅替换父布局中的特定窗格,或者
  3. 将所有窗格放在 中,然后将要显示的窗格移动到堆栈子列表的顶部。StackPane

动画过渡

如果您想在窗格之间进行动画转换,请参阅Angela Caicedo关于在JavaFX中管理多个屏幕的两部分系列:

Angela 的解决方案是将 StackPane 与单独的自定义 ScreenController 类结合使用,以管理堆栈中窗格之间的过渡动画


框架

JFXFlowWebFX等框架还可以为您的应用程序提供浏览器样式的界面,允许用户使用后退和前进按钮以及历史记录列表在屏幕之间来回切换。

2017 年更新

我认为上述两个框架的开发现在已经失效。其他正在开发的框架是:

还有许多其他人(我不会在这里提供完整的列表)。


相关


答案 2

以下是我的做法:(在此示例中,我创建了两个具有相应控制器的 FXML 文档。它们分别称为FXMLLogin.fxml和Home.fxml)。

所以,从FXMLLogin到Home,

在此示例中,我在 FXMLLoginController 中创建了一个方法,该方法响应该窗体上按下的“登录”按钮:

@FXML
private void login(javafx.event.ActionEvent event) throws IOException
{
    if(pwf1.getText().equals("alphabetathetagamma"))
    {
            Parent blah = FXMLLoader.load(getClass().getResource("Home.fxml"));
            Scene scene = new Scene(blah);
            Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            appStage.setScene(scene);
            appStage.show();
    }
    else
    {
            label1.setText("Password is incorrect. Please Try Again");
    }
}

请注意,@FXML非常重要。

如果我正确地理解了你的问题,那么这应该可以解决问题。

在窗格之间切换根本不明显,并且在我找到的Web上的任何教程中都没有清楚地概述。在我第一次弄清楚之前,我不得不自己广泛地谷歌搜索。幸运的是,一旦你掌握了它的窍门,它实际上非常简单。

我希望我没有误解你的问题?让我知道这是否是你需要的:)


推荐