如何为两种形式使用一个控制器?

时间:2015-08-15 21:08:32

标签: java javafx javafx-2 javafx-8

在使用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

如何为两种表格使用一个控制器?

1 个答案:

答案 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下面的评论

之后编辑的