将 FXML 中定义的 AnchorPane 动态添加到选项卡并稍后访问此窗格内容

Dynamically adding AnchorPane defined in FXML to Tabs and getting later access to this Pane content

我想将 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);
    }
}

不确定这是我应该做的正确方法。想知道可接受的 splution。现在我想访问标有 fx:id="columnName" 的列。如何访问每个选项卡的 ControllerFXMLTableView

12 个月对于仅在 fxml 中编码(并且动态代码没有问题)来说并不算多,但这只是需要一个循环。

How to get access to ControllerFXMLTableView for each tab ?

只需在 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());