JavaFx TabPane:每个Tab一个控制器

时间:2016-06-29 09:28:27

标签: javafx tabs controller

我是javafx的新手,我试图在每个标签页上设置一个控制器。 我找到了这个答案:https://stackoverflow.com/a/19889980/393984让我这样做:

Main.fxml

<TabPane fx:controller="sample.Controller" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/null">
  <tabs>
    <Tab text="Configuration">
      <content>
        <fx:include fx:id="mConfigTabPage" source="configTab.fxml"/>
      </content>
    </Tab>
    <Tab text="TODO">
      <content>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
      </content>
    </Tab>
  </tabs>
</TabPane>

configTab.fxml

<Pane fx:controller="sample.ConfigController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label layoutX="23.0" layoutY="22.0" text="API Key :" />
      <TextField layoutX="95.0" layoutY="18.0" fx:id="mAPIKey" />
   </children>
</Pane>

Controller.java

public class Controller {
    private Stage mStage;

    @FXML
    private ConfigController mConfigTabPage;

    public void Controller(){}

    public void setStage(Stage stage)
    {
        mStage = stage;
    }

    @FXML
    public void initialize() {
        System.out.println("CONTROLLER");
    }
}

ConfigController.java

public class ConfigController {
    public void ConfigController(){}

    @FXML
    public void initialize() {
        System.out.println("CONFIG CONTROLLER");
    }
}

如果我删除

,我的程序就会启动
@FXML
private ConfigController mConfigTabPage;

在主控制器中。

但是一旦我添加它,我有以下例外:

  

java.lang.IllegalArgumentException:无法设置   sample.ConfigController字段sample.Controller.mConfigTabPage到   javafx.scene.layout.AnchorPane

所以我猜测javafx试图将我的控制器转换为AnchorPane并导致问题。

如何在主控制器中引用每个窗格的控制器,我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果您希望fx:id="something" controller 将后缀Controller附加到Java成员字段。所以你必须使用:

@FXML
private ConfigController mConfigTabPageController;

请参阅reference