JavaFx ans场景生成器中选项卡之间的通信
我制作了一个MainEnterdController,其中包含一个带有两个选项卡(HomeController)和(PatientController)的选项卡窗格,MainEnterdController控制这两个选项卡之间的参数通道,但我有一个问题,即选项卡不能重新设置父选项卡(MainEnterdController)或彼此。它在这一行中重复了一个错误 ***labelpatient.setText(mainec.LoadtxtFromlabelhometabhome())****** 其思想是从第一个选项卡获取文本,并在第二个选项卡的标签中显示 这是我的密码 第一个是容器的mainterred类JavaFx ans场景生成器中选项卡之间的通信,java,javafx,tabs,parameter-passing,tabpanel,Java,Javafx,Tabs,Parameter Passing,Tabpanel,我制作了一个MainEnterdController,其中包含一个带有两个选项卡(HomeController)和(PatientController)的选项卡窗格,MainEnterdController控制这两个选项卡之间的参数通道,但我有一个问题,即选项卡不能重新设置父选项卡(MainEnterdController)或彼此。它在这一行中重复了一个错误 ***labelpatient.setText(mainec.LoadtxtFromlabelhometabhome())****** 其
public class MainEntredController {
@FXML MenuItem closemi;
@FXML HomeController homecontroller;
@FXML PatientController patientcontroller;
public void initialize(URL location, ResourceBundle resources) {
System.out.println("Application Started");
homecontroller.intit(this);
patientcontroller.init(this);
}
public void ClickMenuItemClose(){
System.exit(0);
}
public String LoadtxtFromlabelhometabhome() {
// System.out.println(homecontroller.labelhome.getText());
return homecontroller.labelhome.getText();
}
public void setTabpatientlabel(String text) {
//patientcontroller.labelpatient.setText(text);
}
}
第二个是HomeController的第一个选项卡
public class PatientController {
public MainEntredController mainec;
@FXML public Label labelpatient;
@FXML private TextField tfpatient;
@FXML private Button savepatient;
@FXML private Button loadpatient;
public void btnSavePatientClicked(ActionEvent event){
System.out.println("le boutton save Patient est cliqué");
labelpatient.setText(tfpatient.getText());
}
public void btnLoadPatientClicked(ActionEvent event){
System.out.println("le boutton Load patient est cliqué");
labelpatient.setText(mainec.LoadtxtFromlabelhometabhome());
}
public void init(MainEntredController mainEntredController) {
mainec = mainEntredController;
}
}
公共类家庭控制器{
public MainEntredController mainec;
@FXML public Label labelhome;
@FXML private TextField tfhome;
@FXML private Button savehome;
@FXML private Button sendhome;
//public HomeController(){}
public void btnSaveHomeClicked(ActionEvent event){
System.out.println("le boutton save home est cliqué");
labelhome.setText(tfhome.getText());
}
public void btnSendHomeClicked(ActionEvent event){
System.out.println("le boutton send home est cliqué");
// send data to tab patient
mainec.setTabpatientlabel(labelhome.getText());
}
public void intit(MainEntredController mainEntredController) {
mainec = mainEntredController;
}
}
第三个是第二个选项卡PatientController
public class PatientController {
public MainEntredController mainec;
@FXML public Label labelpatient;
@FXML private TextField tfpatient;
@FXML private Button savepatient;
@FXML private Button loadpatient;
public void btnSavePatientClicked(ActionEvent event){
System.out.println("le boutton save Patient est cliqué");
labelpatient.setText(tfpatient.getText());
}
public void btnLoadPatientClicked(ActionEvent event){
System.out.println("le boutton Load patient est cliqué");
labelpatient.setText(mainec.LoadtxtFromlabelhometabhome());
}
public void init(MainEntredController mainEntredController) {
mainec = mainEntredController;
}
}
和mainterred的FXML文件
<fx:include id="homecontroller" source="home.fxml" />
<fx:include id="patientcontroller" source="patient.fxml" />
我想这两个人正在制造问题,有什么建议吗
我不知道为什么我在declarred erlier行出现java.lang.NullPointerException,他无法获取源代码(未知源代码)如果我理解正确,那么您希望在控制器之间进行通信。嗯,这可以很容易地做到 在您的主类型中,类似以下内容:
FXMLLoader loader = new FXMLLoader(Main.class.getResource("your.fxml"));
Parent node = loader.load(); // this loads view
YourController instance = loader.getController();
some_class.initialize(instance);
很好,我发现了问题所在。问题是在两个选项卡的主控制器中的声明中,我们将声明的fx:id放在了fxml文件中 并加上"Controller"一词 像这样
@FXML private HomeController homeController;
@FXML private PatientController patientController;
fx:id=“主页”
第二个包括fx:id=“patient”我很确定代码在到达该行之前会失败,因为控制器字段名是错误的,请参见fxml没有使用
fx
命名空间中的id
属性…我需要更改什么?在该示例中,他们建议从两个includs选项卡中创建相同的源,这会给出一个错误,应该更改什么d i do pleaseNested控制器的使用方法如下所述:。它们没有告诉您的是,如何选择注入控制器的字段的名称(请参阅我在前面的评论中链接的问题的答案)。现在无法就问题的其他部分提供建议,因为您描述了一个错误,如果使用了您发布的代码(linehomecontroller.intit(this);mainterdcontroller中的
。initialize
应该生成一个NPE,而不是前面提到的那一行)。非常感谢,我将对嵌套控制器进行一些研究,以解决它不起作用的问题,它会在主FXML文件中出现loadException。它起作用,但您必须为FXMLLoader提供正确的URI