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

JavaFX:在实例化控制器类时传递参数

慕佑运
2023-03-14
/*
 * for Work Order button
 */
@FXML
private void pressWorkOrder() throws Exception{ 
    WorkOrderController wo = new WorkOrderController("ashdkjhsahd");    //instantiating constructor     

    Parent parent = FXMLLoader.load(getClass().getResource("/fxml/WorkOrder.fxml"));        
    Scene scene = new Scene(parent);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.setTitle("Word Order");
    stage.setResizable(false);
    stage.show();
}

下面是我的实际控制人课:

public class WorkOrderController implements Initializable{

     @FXML
     private Button summary;
     private String m,n;

     public WorkOrderController(String str) {
         // TODO Auto-generated constructor stub
         m = str;
     }  

     //for testing
     public void set(String str){
         m = str;
     }  

     @FXML
     public void check(){
         System.out.println("Output after constructor was initialized " + m);
     }

     @Override
     public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
     }
 }

我得到了一个例外:

at javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at MainController.pressWorkOrder(MainController.java:78)
... 57 more
Caused by: java.lang.InstantiationException: WorkOrderController
at java.lang.Class.newInstance(Unknown Source)
at sun.reflect.misc.ReflectUtil.newInstance(Unknown Source)
... 71 more
Caused by: java.lang.NoSuchMethodException: WorkOrderController.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
... 73 more

共有1个答案

红朝
2023-03-14

对于小型应用程序,最简单的两种方法是:

>

  • 不要在FXML中指定fx:controller。通过将数据传递给controller实例来创建controller实例,然后将其传递给FXMLLoader。

    在FXML中指定fx:controller。从FXMLLoader中获取控制器实例并将数据传递给控制器。

      null
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.layout.FlowPane?>
    <?import javafx.scene.control.Label?>
    
    <FlowPane fx:id="root" xmlns:fx="http://javafx.com/fxml">
        <children>
            <Label fx:id="firstName" text="" />
            <Label fx:id="lastName" text="" />
        </children>
    </FlowPane>
    
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Label;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    public class SampleController implements Initializable {
    
        private StringProperty firstNameString = new SimpleStringProperty();
        private StringProperty lastNameString = new SimpleStringProperty();
    
        /**
         * Accepts the firstName, lastName and stores them to specific instance variables
         * 
         * @param firstName
         * @param lastName
         */
        public SampleController(String firstName, String lastName) {
            firstNameString.set(firstName);
            lastNameString.set(lastName);
        }
    
        @FXML
        Label firstName;
    
        @FXML
        Label lastName;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            firstName.setText(firstNameString.get());
            lastName.setText(lastNameString.get());
        }
    }
    

    main-创建一个控制器实例,方法是将值传递给它,然后将其传递给FXMLLoader

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.FlowPane;
    import javafx.stage.Stage;
    
    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) throws Exception {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
    
            // Create a controller instance
            SampleController controller = new SampleController("itachi", "uchiha");
            // Set it in the FXMLLoader
            loader.setController(controller);
            FlowPane flowPane = loader.load();
            Scene scene = new Scene(flowPane, 200, 200);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    fxml-已指定fx:controller

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.layout.FlowPane?>
    <?import javafx.scene.control.Label?>
    
    <!-- Controller Specified -->
    <FlowPane fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="SampleController">
        <children>
            <Label fx:id="firstName" text="" />
            <Label fx:id="lastName" text="" />
        </children>
    </FlowPane>
    

    Controller-具有接受输入的Setter方法

    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Label;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    public class SampleController implements Initializable {
    
        @FXML
        Label firstName;
    
        @FXML
        Label lastName;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
        }
    
        /**
         * Accepts a String and sets it to the firstName Label
         *
         * @param firstNameString
         */
        public void setFirstName(String firstNameString) {
            firstName.setText(firstNameString);
        }
    
        /**
         * Accepts a String and sets it to the lastName Label
         *
         * @param lastNameString
         */
        public void setLastName(String lastNameString) {
            lastName.setText(lastNameString);
        }
    }
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.FlowPane;
    import javafx.stage.Stage;
    
    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) throws Exception {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
            FlowPane flowPane = loader.load();
            // Get the Controller from the FXMLLoader
            SampleController controller = loader.getController();
            // Set data in the controller
            controller.setFirstName("itachi");
            controller.setLastName("uchiha");
            Scene scene = new Scene(flowPane, 200, 200);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

  •  类似资料:
    • 我已经坚持了几个小时。我不知道为什么我的JavaFX控制器指向null。我在中制作了一个JavaFX GUI,将控制器类及其适当的骨架代码添加到我的项目中。但是当我在我的方法中实例化控制器时,它指向null。 使用文件夹树: 我遵循了此处和此处提及的说明,以及其他一些StackOverflow页面。我完全按照上面提到的方式复制指令,但我的控制器仍然为空。 我缺乏想法,有人知道我做错了什么吗?

    • 问题内容: 我想单击一列并将单元格索引发送到新阶段。但是我无法将参数()传递给另一个控制器。我已经尝试了所有方法,但仍然无法正常工作。 主控制器 EditClientController 问题答案: 如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且 要访问方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂:

    • 我无法完成的任务是将参数从一个场景传递到另一个场景并返回。 或者换句话说:主控制器加载子控制器的fxml,将对象传递给子控制器,切换场景。不得有两扇开着的窗户。工作完成后,副控制器将场景切换回主控制器,并将一些对象传递回主控制器。这就是我失败的地方。 这个问题和这个问题很相似但仍然没有答案。传递参数JavaFX FXML在注释中也提到了: 有没有人知道如何在没有外部库的情况下实现这一点?

    • 问题内容: 我的图像是我试图将数据(变量)从一个阶段传递到另一阶段,但是当我尝试在第二阶段访问它们时,它们为空。mainWindow的代码。前往window1 // window1类: 如果我想访问以前收到的标题,则为null 初始化显示应该为“ Window1”时显示为null} 问题答案: 在加载FXML文件的过程中,将调用该方法-换句话说,在调用时将调用该方法。 显然,这是 在 调用 之前

    • 我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面

    • 我正在开发一个JavaFX应用程序,它有几个“子”FXML视图。我正在努力确保所有的孩子都能访问“根”布局。 下面是我的应用程序的基本层次结构: 我的问题是,我不知道如何将控制器的实例传递给以便它能够访问该控制器中的方法。我在每个类中确实有一个方法,允许我将的控制器传递给它: 将传递给不是问题,因为我可以将它与构造函数一起传递。但如果不知道的实际名称,我将如何调用该方法?有没有办法从块中调用新控制