我有一个关于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;
}
}
答案 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();
}
}
将SecondController注册为模型的观察者。将模型设置为控制器时,添加与此类似的行: model.addObserver(本);
SecondController必须实现java.util.Observer.update(...)
void update(Observable o,Object o1){
//使用模型值设置标签文本
}
在模型中调用setBtnname()方法时,在FirstController中的事件处理程序中,将调用SecondController中的update()方法。您可以在此处添加代码以更改标签文本。由于标签位于由SecondController控制的视图中,因此您只需要使用@FXML注释在控制器中注入标签的引用。