无法在按钮单击事件上调用另一个 fxml 页面

Unable to Call another fxml page on button click event

我正在尝试想出一个简单的工具,我想通过单击当前 fxml 页面上的按钮调用另一个 fxml 页面。 我的MainJavaclass设计如下:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.BorderPane;


public class Main extends Application 
{

  @Override
  public void start(Stage stage) {
    try {

        TitledPane page = (TitledPane)FXMLLoader.load(getClass().getResource("NewTest.fxml"));
         Scene scene = new Scene(page);
        stage.setScene(scene);
            stage.setTitle("Welome Page");
            stage.show();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
    Application.launch(Main.class, (java.lang.String[])null);
}}

控制器 Class 设计为:

import javafx.event.ActionEvent;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.TitledPane;
import javafx.stage.Stage;


public class SimpleController implements Initializable 
{

   @FXML //  fx:id="loginbtn"
   private Button loginbtn; // Value injected by FXMLLoader


   @Override // This method is called by the FXMLLoader when
                 initialization is complete
   public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
    assert loginbtn != null : "fx:id=\"myButton\" was not injected: check your FXML file 'simple.fxml'.";

    // initialize your logic here: all @FXML variables will have been injected
    loginbtn.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
             Stage stage; 
             Parent root;
             if(event.getSource()==loginbtn){
                //get reference to the button's stage         
                stage=(Stage) loginbtn.getScene().getWindow();
                //load up OTHER FXML document
                try{
                    TitledPane page =(TitledPane) FXMLLoader.load(getClass().getResource("secondPage.fxml"));
                }catch(Exception e)
                {e.printStackTrace();}
              }
        }
    });
}
}

Fxml 页面如下:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

 <TitledPane text="Welcome to the Vacation Planner" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
  <content>
      <AnchorPane prefHeight="330.0" prefWidth="497.0">
         <children>
            <Label layoutX="14.0" layoutY="52.0" prefHeight="25.0"  prefWidth="189.0" text="User Name">
              <font>
                  <Font size="24.0" />
              </font>
             </Label>
             <TextArea layoutX="53.0" layoutY="106.0" prefHeight="41.0" prefWidth="391.0" />
                <Label layoutX="14.0" layoutY="165.0" text="Password">
                 <font>
                    <Font size="24.0" />
           </font>
        </Label>
        <Button fx:id="loginbtn" layoutX="114.0" layoutY="262.0" mnemonicParsing="false" text="Login">
           <font>
              <Font size="18.0" />
           </font>
        </Button>
        <Button fx:id="exitbtn" layoutX="271.0" layoutY="262.0" mnemonicParsing="false" text="Exit">
           <font>
              <Font size="18.0" />
           </font>
           </Button>
           <PasswordField layoutX="53.0" layoutY="207.0" prefHeight="39.0" prefWidth="391.0" />
         </children>
        </AnchorPane>
       </content>
      </TitledPane>

当我点击登录按钮时,它没有打开我试图通过点击按钮打开的第二个 xml 页面。

提前致谢。

您加载 Nodes 然后什么也不做。

您需要将它们添加到现有场景或替换该场景:

try{
    TitledPane page =(TitledPane) FXMLLoader.load(getClass().getResource("secondPage.fxml"));
    Scene newScene = new Scene(page);
    stage.setScene(newScene);
} catch(Exception e) {
    e.printStackTrace();
}

此外,您还没有将控制器与 fxml 相关联。使用例如fx:controller 属性和 fxml 根部的控制器 class 的完全限定 class 名称来执行此操作:

<TitledPane text="Welcome to the Vacation Planner" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="my.package.SimpleController">

其中 my.package 是包含控制器的包。