JavaFX将文本字段从当前控制器设置为下一个控制器

时间:2016-07-11 16:45:15

标签: java javafx

我对stackoverflow和javafx都很新,所以请你好。

我正在做的事情的描述:

我正在制作一个简单的问答游戏。第一个窗口就像一个欢迎/开始屏幕,当点击该按钮时,我们进入第二个屏幕,其中所有类别按钮都是,当点击其中一个按钮时,它会随机选择用户选择的那种类别的问题第三个也是最后一个窗口将显示问题类别作为标签,问题作为文本字段,answear作为文本字段。

enter image description here

问题: 每当点击一个类别时,我需要当前的控制器来设置下一个控制器的文本字段和标签。我还没有达到这个目的。当我在第二个控制器FXMLCategoriesDocumentController中调用setQuestion方法时,我只是得到一个nullpointerexception,当我尝试调试它时,它只是说实例化的“questControll”一直是null,并且“questControll.question / category / answear”从空对象引用

代码:

第二个控制器

public class FXMLCategoriesDocumentController implements Initializable {

/**
 * Initializes the controller class.
 */
private FXMLQuestionDocumentController questControll;
private Question quest;

@FXML
private void geografButtonAction(ActionEvent event) {
    try {
        FXMLLoader fxmlQuestLoader = new FXMLLoader(getClass().getResource("FXMLQuestionDocument.fxml"));
        this.questControll = fxmlQuestLoader.<FXMLQuestionDocumentController>getController();

        quest = new Question("Geografi", "Vad heter Sveriges huvudstad?", "Stockholm");
        questControll.setQuestion(quest.getCategory(), quest.getQuestion(), quest.getAnswear());
        Parent root1 = (Parent) fxmlQuestLoader.load();
        root1.setId("pane");
        Stage app_stage = (Stage)((Node) event.getSource()).getScene().getWindow();
        Scene root1_scene = new Scene(root1);
        root1_scene.getStylesheets().addAll(this.getClass().getResource("style.css").toExternalForm());
        app_stage.hide();
        app_stage.setScene(root1_scene);
        app_stage.show();

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

第三个​​控制器

public class FXMLQuestionDocumentController implements Initializable {


private FXMLCategoriesDocumentController catControll;
private Question quest;

@FXML
public Label category = new Label();
@FXML
public TextField question = new TextField();
@FXML
public TextField answear = new TextField();
/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
}
public void setQuestion(String cat, String quest, String ans){
    if(category.getText() == null || question.getText() == null || answear.getText() == null){
        System.out.println("everything is null");
    }else{
        category.setText(cat);
        question.setText(quest);
        answear.setText(ans);

    }
}

问题类

public class Question {
private String category;
private String question;
private String answear;

public Question(String cat, String quest, String ans){
    this.category = cat;
    this.question = quest;
    this.answear = ans;
}


public void setCategory(String cat){
    this.category = cat;
}
public void setQuestion(String quest){
    this.question = quest;
}
public void setAnswear(String ans){
    this.answear = ans;
}
public String getCategory(){
    return category;
}
public String getQuestion(){
    return question;
}
public String getAnswear(){
    return answear;
}

}

FXML第二个控制器(类别) category xml

FXML第三控制器(问题)

question xml

1 个答案:

答案 0 :(得分:1)

您可以在(f)xml-Tree的最高元素中使用fx:controller - 标记(here)指定每个XML文件中的控制器类。

您可以使用以下方法加载它:

YourCustomController controller;
//some code...
try {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FXMLQuestionDocument.fxml"));
    controller = loader.<YourCustomController>getController();
    //assume that we create a question here
    Question q = new Question(...);
    controller.setQuestion(q);
}
//further code...

评论后修改:

正如fabian所说,如果为FXML文件中的元素设置fx:id - 标记,则在初始化()方法之前创建使用@FXML注释的属性。 fx:id - 标记必须与控制器中的属性相同。

在你的fxml文件中(例如Label):

<Label fx:id="question" ...>
    ....
</Label>

Controller-class

public class YourCustomController implements Initializable {

    @FXML Label question;

    //...
    public void initialize() {
    //...
    }

    public void setQuestion(Question q) {
         question.setText(q.getQuestion();
    }
}

有关详细信息,请参阅jewelseas评论中的链接。

我明天试了这个,希望我能以正确的方式把它转移到这里。

从7月13日开始编辑

FXMLQuestionDocumentController中,您无需初始化控件。参见:

  public class FXMLQuestionDocumentController implements Initializable {

      private FXMLCategoriesDocumentController catControll;
      private Question quest;

      @FXML
      public Label category;
      @FXML
      public TextField question;
      @FXML
      public TextField answear;
}

此外,初始化Pane后初始化控制器。

  `@FXML
   private void geografButtonAction(ActionEvent event) {
   try {
       FXMLLoader fxmlQuestLoader = new FXMLLoader(getClass().getResource("FXMLQuestionDocument.fxml"));
       quest = new Question("Geografi", "Vad heter Sveriges huvudstad?", "Stockholm");

       Parent root1 = (Parent) fxmlQuestLoader.load();
       root1.setId("pane");
       this.questControll = fxmlQuestLoader.FXMLQuestionDocumentController>getController();
       questControll.setQuestion(quest.getCategory(), quest.getQuestion(), quest.getAnswear());
       Stage app_stage = (Stage)((Node) event.getSource()).getScene().getWindow();
       Scene root1_scene = new Scene(root1);
       root1_scene.getStylesheets().addAll(this.getClass().getResource("style.css").toExternalForm());
       app_stage.hide();
       app_stage.setScene(root1_scene);
       app_stage.show();

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

}`