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