我对stackoverflow和javafx都是新手,所以请友好一点。
描述我正在做的事情:
我正在做一个简单的问答游戏。第一个窗口就像一个欢迎/开始屏幕,当点击那个按钮时,我们会到达第二个屏幕,所有的类别按钮都在那里,当点击其中一个时,它会随机选择用户选择的类别的问题第三个也是最后一个窗口将显示问题类别作为标签,问题作为文本字段,回答作为文本字段。
问题:每当一个类别被点击时,我需要当前控制器来设置下一个控制器文本字段和标签。我还没有走到这一步。当我调用第二个控制器FXML类别文档控制器中的setInformation方法时,我只是得到了一个nullpointerest的拦截,当我试图调试它时,它只是说实例化的“questControlll”一直是null,并且“questControll.question/category/answear”是从null引用的对象
代码:
第二控制器
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第二控制器(类别)类别xml
FXML第三控制器(问题)
问题xml
您可以在每个XML-File中使用(f)xml-Tree的最高元素中的fx:控制器
-Tag(此处)来指定控制器的类。
然后,您可以使用以下方法加载它:
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
-标记必须与控制器中的属性相同。
在fxml-file(例如Label)中:
<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日开始编辑
在您的FXMLCountionDocumentController
中,您不需要初始化控件。见:
public class FXMLQuestionDocumentController implements Initializable {
private FXMLCategoriesDocumentController catControll;
private Question quest;
@FXML
public Label category;
@FXML
public TextField question;
@FXML
public TextField answear;
}
另外,在初始化窗格
后初始化控制器。
`@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应用程序中,我们有两个FXML文件,第一个。FXML和second.FXML,相同的第一个Controller.java和secondController.java现在主要的问题是第一个。FXML包含TextField name和on Button当用户单击那个按钮时second.FXML显示在second.FXML中我有一个组合框和一个按钮当用户单击second.FXML按钮时
和访问字段,如: 因为我希望有更好的方法来做到这一点。
我想控制Javafx TextField中的输入,以便只允许数字输入,并且如果超过了最大字符数,则不会对TextBox进行任何更改。 编辑:根据注释中的建议,我使用了JavaFX项目负责人建议的方法。阻止信件被输入很有效。我只需要它也过滤特殊字符。我尝试将筛选器更改为(text.matchs([0-9]“),但这不允许输入退格符。
需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢
我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。
我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面