在使用JavaFX编写我的第一个应用程序时,我遇到了几个问题。以下是其中之一: 我有一个表格,其中包含两种形式。 F.e:
<GridPain>
<fx:include source="Form1.fxml"/>
<fx:include source="Form2.fxml"/>
</GridPain>
我在每个表单中创建了一个相同控件的引用(Form1.fxml,Form2.fxml)Form1包含TextField:
<TextField fx:id="name"/>
Form2包含按钮:
<Button fx:id="sayYourName"/>
我在控制器中包含按钮和文本字段:
public class MyController implements Initializable {
@FXML
private Button sayYourName;
@FXML
private TextField name;
@Override
public void initialize(URL location, ResourceBundle resources) {
if (name == null) {
System.out.println(true);
}
if (sayYourName == null) {
System.out.println(true);
}
}
}
请告诉我,为什么我
true
true
如何为两种表格使用一个控制器?
答案 0 :(得分:1)
当我开始时,我一直在努力解决这个问题,所以这里有一个建议,可以帮助你。有两个单独的表单,每个表单都有自己的控制你有一个&#39;主人&#39;两个表单加载到的表单。首先加载这样一个表单:
private VBox view1;
private Pane view2;
private View1Controller view1Controller;
private View2Controller view2Controller;
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("form1.fxml"));
view1 = (Pane) loader.load();
view1Controller = loader.<View1Controller>getController();
} catch (IOException e) {
e.printStackTrace();
}
类似于form2。
您的rootView也将以相同的方式加载。
加载rootView后,您可以将两个表单添加到rootView。 E.g。
rootView.getChildren().add(view1);
rootView.getChildren().add(view2);
现在你有两个带两个控制器的表格。如果一个控制器需要与另一个控制器通信,则可以设置类似的参考:
view2Controller.init(view1Controller);
在view2Controller中你有:
View1Controller view1Controller;
public void init(View1Controller controller){
this.view1Controller = controller;
}
此view2Controller之后可以调用view1Controller中的方法,如下所示:
view1Controller.xxxxx();
根据您的应用程序的复杂程度,拥有一个主人&#39;可能是一个好主意。控制器(如MVC或MVP结构)并将其他人用作“奴隶”。控制器。控制器可以通过传递如上所示的引用来相互通信。
注意:这是在James下面的评论
之后编辑的