gpt4 book ai didi

JavaFX 将文本字段从当前 Controller 设置到下一个 Controller

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:53 27 4
gpt4 key购买 nike

我对 stackoverflow 和 javafx 都很陌生,所以请多关照。

我在做什么的描述:

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

enter image description here

问题:每当单击一个类别时,我都需要当前 Controller 来设置下一个 Controller 文本字段和标签。我还没有深入了解这一点。当我在第二个 Controller FXMLCategoriesDocumentController 中调用 setQuestion 方法时,我只是得到一个 nullpointerexception,当我试图调试它时,它只是说实例化的“questControll”一直为 null,而“questControll.question/category/answear”从空对象引用

代码:

第二个 Controller

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

第三 Controller

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 第二个 Controller (类别) category xml

FXML 第三个 Controller (问题)

question xml

最佳答案

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

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

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 标签,则在 initialize() 方法之前创建带有 @FXML 注释的属性。 fx:id 标签必须与 Controller 中的属性相同。

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

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

在您的 Controller 类中:

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 之后初始化 Controller 。

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

}`

关于JavaFX 将文本字段从当前 Controller 设置到下一个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38312123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com