【问题标题】:JavaFX set textfields from current controller to the next controllerJavaFX 将文本字段从当前控制器设置到下一个控制器
【发布时间】:2016-11-13 16:57:15
【问题描述】:

我对 stackoverflow 和 javafx 都比较陌生,所以请善待。

我在做什么的描述:

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

问题: 每当单击一个类别时,我都需要该当前控制器来设置下一个控制器的文本字段和标签。我还没有走到这一步。当我在第二个控制器 FXMLCategoriesDocumentController 中调用 setQuestion 方法时,我只是得到一个 nullpointerexception,当我尝试调试它时,它只是说实例化的“questControll”一直为空,而“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

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    您可以通过在 (f)xml-Tree 的最高元素中使用 fx:controller-Tag (here) 来指定每个 XML-File 中的控制器类。

    然后你可以使用这个来加载它:

    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...
    

    在 cmets 之后编辑:

    正如 fabian 所说,如果为 FXML 文件中的元素设置了 fx:id-tag,则在 initialize() 方法之前创建带有 @FXML 注释的属性。 fx:id-tag 必须与控制器中的属性相同。

    在您的 fxml 文件中(例如标签):

    <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();
      }
    

    }`

    【讨论】:

    • @Supahupe 当我这样做时,我只是在 questioncontroller 中尝试使用方法 setQuestion 时得到一个 nullpointerException !我将编辑我的问题,以便您查看我的编辑
    • FXML 的根元素是什么?它是否包括 fx:controller 标记,正如 Supahupe 所建议的那样,带有(完全限定的)控制器类名称的值?如果您仍然有问题,您可能希望在您的问题中提供您的 FXML。
    • @jewelsea,你能给我举个例子吗,因为我不太明白
    • Oracle FXML documentation&lt;VBox fx:controller="com.foo.MyController" xmlns:fx="http://javafx.com/fxml"&gt;。另见相关问题:Passing Parameters JavaFX FXML
    • @Supahupe 你一定是在开玩笑,哈哈,它有效!感谢您的耐心和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2017-10-29
    相关资源
    最近更新 更多