将FXML中定义的AnchorPane动态添加到选项卡,并在以后访问此Pane内容

时间:2019-02-27 11:35:34

标签: java javafx fxml

我想将TableView动态添加到标签。现在,我想访问控制器。我不知道该怎么做。这是代码:

sample.fxml代码:

<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <TabPane fx:id="tabPane">
    </TabPane>
</GridPane>

控制器:

public class Controller {

    @FXML
    private TabPane tabPane;

    public TabPane getTabPane() {
        return tabPane;
    }

    public void setTabPane(TabPane tabPane) {
        this.tabPane = tabPane;
    }
}

FXMLTableView.fxml代码:

<AnchorPane xmlns="http://javafx.com/javafx"
        xmlns:fx="http://javafx.com/fxml"
        fx:controller="sample.ControllerFXMLTableView"
        prefHeight="400.0" prefWidth="600.0">

    <TableView>
        <columns>
            <TableColumn fx:id="columnName" text="name"/>
            <TableColumn text="surname"/>
        </columns>
    </TableView>
</AnchorPane>

和控制器:

public class ControllerFXMLTableView {

    @FXML
    private TableColumn columnName;

    public ControllerFXMLTableView() {}

    public TableColumn getColumnName() {
        return columnName;
    }

    public void setColumnName(TableColumn columnName) {
        this.columnName = columnName;
    }
}

在Main.java中,我有以下代码:

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        FXMLLoader loaderSample = new FXMLLoader(getClass().getResource("sample.fxml"));
        Parent root = loaderSample.load();

        Controller controller = loaderSample.getController();

        TabPane tabPane = controller.getTabPane();

        List<String> listMonths = List.of("January", "February", "March", "April");

        listMonths.forEach(itemList -> {
            try {
                Tab tabTemp = new Tab(itemList.toString());
                AnchorPane anchorPane = FXMLLoader.load(getClass().getResource("FXMLTableView.fxml"));
                tabTemp.setContent(anchorPane);
                tabPane.getTabs().add(tabTemp);
            } catch(Exception ex){}
        });


        stage.setTitle("Hello World");
        stage.setScene(new Scene(root, 300, 275));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

不确定这是我应该使用的正确方法。想知道可接受的污染。现在,我想访问标记为fx:id="columnName"的列。如何访问每个标签的ControllerFXMLTableView

仅用fxml进行编码(对于动态代码没有问题)的12个月并不是很多,但这只是要求循环。

1 个答案:

答案 0 :(得分:2)

  

如何为每个选项卡访问ControllerFXMLTableView?

只需在forEach循环中执行此操作:

 FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLTableView.fxml"));
 AnchorPane anchorPane = loader.load();
 ControllerFXMLTableView tabController = loader.getController();
 TableColumn column = tabController.getColumnName();

编辑:要烦恼引用供以后使用,您可以定义一个适当的容器,例如Map<String,TableColumn> columns = new HashMap<>();并使用它: columns.put(itemList, tabController.getColumnName());