Javafx如何从第一个控制器访问第二个控制器的控件

Javafx how to access controls of second controller from first controller

我有一个关于 Javafx 控制器的问题。 可以说,我有多个 fxml 文件在主应用程序中绑定在一起。然后我为每个 fxml 文件都有单独的控制器。让我们看看下面的结构

com.par.app
  - MainApp.java   -> This is the main Application
  - FirstController.java 
  - SecondController.java

com.par.app.view
  - First.fxml
  - Second.fxml 

com.par.app.model
  - MyModel   -> This has some getter and setter methods.

现在按照上面的结构,我在 First.fxml 中有一个复选框,在 Second.fxml 中有一个标签。

我的问题:如何通过选中和取消选中 First.FXML 中的复选框来设置 Second.FXML 中的标签文本,我试过这样:

// In FirstController.Java
  1) Initialize the SecondController
  2) Get checkbox from FXMl as , priate CheckBox box1;
  3) On initialize(....) method, I have set the event handler, as box1.setOnAction(enableHandle)
  4) Finally the event Handler as,
  EventHandler<ActionEvent> enableHandle = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        if (box1.isSelected()) {

            secondController.setLabelText("PoP");
        } else {
            secondController.setText("Gone Wrong");
        }
    }
};

Similarly, On my second controller I have declared FXML control as, 
@FXML
private Label lblTes;

// the method
public void setLabelText(String a)
{
 this.lblTes.settest(a);
}

-> 以上无法正常工作 returns 未知来源。

我尝试的下一个方法是使用 MyModel ,并使用 getter 和 setter 方法,但不成功。

对不起,我的问题很长。我试过但没有成功。 我能做些什么来解决这个问题?

提前致谢。

// my model looks like
public class MyModel {
   private String btnname;
   public String getBtnname() {
       return btnname;
   }
   public void setBtnname(String btnname) {
       this.btnname = btnname;
   }
}

当您选中复选框时,然后在 FirstView 的控制器中(您在其中为复选框单击实现事件处理程序)更改模型中的标签文本。 您的模型应该绑定到您的视图,因此您的 SecondView 中的标签文本应该更新。

如果您没有将模型绑定到您的视图,您可以使用观察者模式。

1.Change 您的模型并扩展 java.util.Observable

public class MyModel extends Observable {
  private String btnname;
  public String getBtnname() {
    return btnname;
  }
  public void setBtnname(String btnname) {
    this.btnname = btnname;
    pingObservers()
  }
  private void pingObservers() {
   setChanged();
   notifyObservers();
  }
}
  1. 将您的 SecondController 注册为模型的观察者。当您将模型设置为控制器时,添加类似于以下的行: model.addObserver(这​​个);

  2. SecondController 必须实现 java.util.Observer.update(...)
    void update(Observable o, Object o1) { // 使用模型值设置标签文本 }

  3. 在 FirstController 中的事件处理程序中,当您在模型上调用 setBtnname() 方法时,将调用 SecondController 中的 update() 方法。您可以添加代码来更改标签文本。由于标签位于由 SecondController 控制的视图中,因此您只需要使用 @FXML 注释在控制器中注入标签的引用。