Динамическое добавление AnchorPane, определенного в FXML, к вкладкам и последующий доступ к содержимому этой панели - PullRequest
0 голосов
/ 27 февраля 2019

Я бы хотел динамически добавлять TableView во вкладки.Теперь я хотел бы иметь доступ к контроллерам.Я не знаю, как это сделать.Вот код:

пример.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 для каждой вкладки?

12 месяцев - это не так уж много, чтобы просто кодировать его в fxml (и у него нет проблем с динамическим кодом), но для этого просто необходим цикл.

1 Ответ

0 голосов
/ 27 февраля 2019

Как получить доступ к 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());

...