将类对象发送到舞台控制器 - javafx

时间:2016-11-20 20:41:14

标签: java javafx

我有一个类FontInfo,我尝试将其对象myFont发送到舞台的新控制器,当我点击按钮时出现。这是我的主控制器类:

public class MainController {

//create instance of font
private FontInfo myFont;

@FXML
private Button btnChooseFont;

public void initialize()
{
    //create new myFont
    myFont = new FontInfo();
}

@FXML
void actionBtnChooseFont(ActionEvent event) {

    try
    {
        //resource to new parent root
        Parent root = FXMLLoader.load(getClass().getResource("../fxml/ChooseFont.fxml"));
        Stage stage = new Stage();
        stage.setTitle("Choose font");
        stage.setScene(new Scene(root, 300, 290));
        stage.show();

        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("../fxml/ChooseFont.fxml"));
        ChooseFontController chooseFontController = loader.getController();
        chooseFontController.setMyFont(myFont);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

}

}

我需要使用我在ChooseFontController类的MainConroller中创建的myFont对象:

public class ChooseFontController {

//myFont object
private FontInfo myFont;

//setter myFont
public void setMyFont(FontInfo myFont) {
    this.myFont = myFont;
}

但我得到空指针异常错误:

Caused by: java.lang.NullPointerException
at controllers.MainController.actionBtnChooseFont(MainController.java:48)

in:chooseFontController.setMyFont(myFont);

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

修改initialize method

@FXML
public void initialize()
{
    //create new myFont
    myFont = new FontInfo();
}

实际上问题是您从不加载ChooseFont.fxml文档,因此您必须编辑代码才能加载fxml文档:

FXMLLoader loader = new FXMLLoader(this.getClass().getResource("../fxml/ChooseFont.fxml"));
try{
  loader.load();
}catch(Exception ex){
 ex.printStackTrace();
}
ChooseFontController chooseFontController = loader.getController();

另请注意,这里使用的是静态构造函数

 Parent root = FXMLLoader.load(getClass().getResource("../fxml/ChooseFont.fxml"));

答案 1 :(得分:1)

似乎FXMLLoader无法找到Controller,因此从loader.getController()返回null。也许打电话loader.load()有助于找到它......例如。

  FXMLLoader loader = new FXMLLoader(this.getClass().getResource("../fxml/ChooseFont.fxml"));
  Loader.load();
  ChooseFontController chooseFontController = loader.getController();
  chooseFontController.setMyFont(myFont);

(Ps。调试在这些情况下帮助找到确切的问题)