fx:id和initialize()没有在javafx中运行

时间:2018-04-19 11:35:12

标签: java javafx fxml

我正在尝试创建一个以网格开头的用户界面。我在scenebuilder中构建了网格,现在我想使用我的控制器添加列和行。但是,我的程序似乎没有在我的控制器中运行initialise(),因为网格不会改变大小。 这是我的主要课程:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;    import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    //@Override 
    public void start(Stage primaryStage) {
        try {
            int width = 7;
            int height = 7;         
            final FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("GUI.fxml"));
            loader.setController(new GUIController(width, height));
            final Parent root = 
            FXMLLoader.load(getClass().getResource("GUI.fxml"));    
            final Scene scene = new Scene(root);
            primaryStage.setTitle("GUI");
            primaryStage.setScene(scene);
            primaryStage.show();            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这是我的控制器类:

import javafx.fxml.FXML;
import javafx.scene.layout.GridPane;

public class GUIController {

    private int width;
    private int height;

    public GUIController(int givenWidth, int givenHeight) {//runs this
        width = givenWidth;
        height = givenHeight;
    }


    @FXML 
    public void initialize() { //doesn't run this
        SetGrid.build(gridpane, width, height);
    }   

这是我第一次在javafx写作,所以我可能犯了简单的错误,抱歉。

1 个答案:

答案 0 :(得分:5)

您正在调用静态 FXMLLoader.load(URL)方法。由于它是静态方法,因此它实际上并不引用您创建的FXMLLoader实例,因此它不会引用您设置的控制器。

不使用参数调用实例方法load()

final Parent root = loader.load();
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    @Override 
    public void start(Stage primaryStage) {
        try {
            int width = 7;
            int height = 7;         
            final FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("GUI.fxml"));
            loader.setController(new GUIController(width, height));

            final Parent root = loader.load();

            final Scene scene = new Scene(root);
            primaryStage.setTitle("GUI");
            primaryStage.setScene(scene);
            primaryStage.show();            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}