切换FXML场景

时间:2019-08-31 05:01:51

标签: java javafx fxml scene

我正在完成程序的一部分,其中涉及将用户从登录屏幕(FIRST fxml)发送到第二个屏幕。应当在程序加载时发生这种情况(基于记忆)。

当我运行程序时,它会加载FIRST和SECOND fxml,但是会继续显示FIRST fxml(应显示SECOND时)。我可以使用具有相同代码的输入(即按钮)从第一个屏幕转到第二个屏幕。

每次尝试设置场景时,我都尝试使用不同的加载器并使用.show()方法,但是这些(或其许多变体)都没有起作用。

我在调用方法时打印-这就是我确定它们已加载的方式(打印行):

  1. 启动方法(主应用程序启动(阶段)方法)
  2. INIT1 METHOD(第一个控制器初始化方法)
  3. INIT2方法(第二个控制器初始化方法的开始)
  4. 已加载的输入UI(第二个控制器初始化方法的结尾)
  5. INIT2方法(每当我在文本上按Enter键时,这两行就会再次出现)
  6. 已加载的输入用户界面(此时确实会切换到新的FXML)

这是我的代码结构的最小表示:

public class Main extends Application {

    private static final FXMLLoader loader = new FXMLLoader();
    private static Stage mainStage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println("START METHOD");
        mainStage = primaryStage; //Copy Reference
        primaryStage.setScene(new Scene(Main.getLoader().load(Main.class.getResource("/res/screenOne.fxml"))));
        primaryStage.show();
    }

    public static FXMLLoader getLoader() {
        return loader;
    }

    public static Stage getStage() {
        return mainStage;
    }
}

/**
 * FXML Controller class
 */
public class firstUI implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        System.out.println("INIT1 METHOD");
        try {
            Parent root = Main.getLoader().load(getClass().getResource("/res/screenTwo.fxml"));
            Main.getStage().setScene(new Scene(root));
        } catch (Exception ex) {
            Logger.getLogger(mainUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

/**
 * FXML Controller class
 */
public class secondUI implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        System.out.println("INIT2 METHOD");
        System.out.println("Loaded Input UI");
    }
}

再次,我希望代码加载firstUI,然后从firstUI加载第二个UI。

相反,输出(在调试中是否首先显示stage.show())似乎是:

  1. firstUI代码从开始运行并初始化(未显示)。
  2. secondUI代码已运行(从firstUI初始化)并已初始化(未显示)。
  3. secondUI初始化代码完成并显示firstUI。
  4. 仅当按下具有相同切换代码的​​输入时,才会从firstUI切换到secondUI。

1 个答案:

答案 0 :(得分:1)

您不需要加载程序的引用即可更改场景。
您可以使用简单的aws logs describe-log-streams --log-group-name {test_log_group_name},例如:

Main

import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { primaryStage.setScene(new Scene(new FXMLLoader().load(getClass().getResource("/res/screenOne.fxml")))); primaryStage.show(); } public static void main(String[] args) { launch(null); } } 所在的位置(请注意窗格的fx-id)。
(要进行测试,您需要使用正确的控制器路径进行编辑):

screenOne.fxml

<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.text.Font?> <AnchorPane fx:id="main" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="FirstUI"> <children> <Label layoutX="155.0" layoutY="132.0" text="Screen 1"> <font> <Font size="24.0" /> </font> </Label> <Button layoutX="264.0" layoutY="246.0" mnemonicParsing="false" onAction="#changeScene" prefHeight="26.0" prefWidth="102.0" text="Change Scene" /> </children> </AnchorPane> 使用FirstUI更新场景:

main

要在此处进行代码MRE,请输入import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.layout.Pane; public class FirstUI { @FXML Pane main; public void changeScene(ActionEvent e) { try { main.getScene().setRoot(new FXMLLoader().load(getClass().getResource("/res/screenTwo.fxml"))); } catch (Exception ex) { ex.printStackTrace(); } } }

screenTwo.fxml