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

时间:2015-03-06 10:27:20

标签: java model-view-controller javafx getter-setter

我有一个关于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);
}

- &GT;以上不会工作,因为它返回未知来源。

我尝试的下一种方法是使用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;
   }
}

1 个答案:

答案 0 :(得分:1)

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

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

1.更改模型并扩展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. 在模型中调用setBtnname()方法时,在FirstController中的事件处理程序中,将调用SecondController中的update()方法。您可以在此处添加代码以更改标签文本。由于标签位于由SecondController控制的视图中,因此您只需要使用@FXML注释在控制器中注入标签的引用。