【问题标题】:communication betwenn Tabs in JavaFx ans Scene builderJavaFx 中的 Tab 和 Scene builder 之间的通信
【发布时间】:2016-01-10 23:06:16
【问题描述】:

我制作了一个 mainEntredController,其中包含一个带有两个选项卡 (HomeController) 和 (PatientController) 的 TabPane,MainEntred 控制这两个选项卡之间的参数传递,但我有一个问题是这些选项卡不会重新协调父级 (MainEntredController) 或彼此.它在这一行返回一个错误 *** labelpatient.setText(mainec.LoadtxtFromlabelhometabhome()); ****** 我们的想法是从第一个选项卡中获取文本以将其显示在第二个选项卡的标签中

听我的代码 第一个是MainEntred Class Container

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

}

}

第二个是第一个 Tab HomeController

公共类 HomeController {

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

以及 MainEntred 的 FXML 文件

<fx:include id="homecontroller" source="home.fxml" />
<fx:include id="patientcontroller" source="patient.fxml" />

我猜这两个问题很烦人,请告诉我如何解决它 我不知道为什么我在声明错误的行上有 java.lang.NullPointerException 他无法获取源(未知源)

【问题讨论】:

  • 我很确定代码在到达该行之前会失败,因为控制器字段名称是错误的,请参阅JavaFx Nested Controllers (FXML <include>) 而且 fxml 不使用来自 @ 的 id 属性987654328@命名空间...
  • 我需要改变什么?在那个例子中,他们建议从两个包含选项卡中创建相同的来源,这会出现错误,我该怎么办
  • 嵌套控制器的使用如下所述:docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/…。他们没有告诉您的是,如何选择注入控制器的字段的名称(请参阅我在上一条评论中链接的问题的答案)。现在不可能就问题的其他部分提供建议,因为您描述了一个错误,如果使用了您发布的代码(MainEntredController.initialize 中的homecontroller.intit(this); 行应该产生 NPE,而不是行提到。)。
  • 非常感谢,我会研究嵌套控制器来解决它

标签: java javafx tabs parameter-passing tabpanel


【解决方案1】:

如果我理解正确,那么您想在控制器之间进行通信。嗯,这很容易做到。

在你的主要类型中是这样的:

FXMLLoader loader = new FXMLLoader(Main.class.getResource("your.fxml"));
Parent node = loader.load(); // this loads view 
YourController instance = loader.getController();
some_class.initialize(instance);

【讨论】:

  • 不起作用,它在 mainFXML 文件中给出了 loadException
  • 它可以工作,但你必须为 FXMLLoader 提供正确的 URI
【解决方案2】:

我终于找到了问题所在。问题是在两个选项卡的 MainController 中的声明中,我们将 fx:id 声明在 fxml 文件中 并添加“控制器”一词

喜欢这个

    @FXML private HomeController homeController;
    @FXML  private PatientController patientController;

fx:id="home" 第二个包括 fx:id="患者"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-04-25
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多