Java 动态地将FXML中定义的AnchorPane添加到选项卡,并在以后访问此窗格内容
我想将Java 动态地将FXML中定义的AnchorPane添加到选项卡,并在以后访问此窗格内容,java,javafx,fxml,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> &
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>
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>
在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);
}
}
public类主扩展应用程序{
@凌驾
public void start(Stage)引发异常{
FXMLLoader loaderSample=新的FXMLLoader(getClass().getResource(“sample.fxml”);
父根=loaderSample.load();
控制器控制器=loaderSample.getController();
TabPane TabPane=controller.getTabPane();
列表月份=列表月份(“一月”、“二月”、“三月”、“四月”);
listMonths.forEach(项目列表->{
试一试{
Tab tabTemp=新选项卡(itemList.toString());
AnchorPane AnchorPane=FXMLLoader.load(getClass().getResource(“FXMLTableView.fxml”);
tabTemp.setContent(锚烷);
tabPane.getTabs().add(tabTemp);
}捕获(例外情况除外){}
});
舞台。片名(“你好世界”);
舞台场景(新场景(根,300275));
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
我不确定这是我应该做的正确方式。我想知道可接受的污染程度。现在我想访问标有fx:id=“columnName”
的列。如何访问每个选项卡的ControllerFXMLTableView
12个月的时间不足以在fxml中编写代码(动态代码也没有问题),但这只需要一个循环
如何为每个选项卡访问ControllerFXMLTableView
只需在forEach
循环中执行即可:
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLTableView.fxml"));
AnchorPane anchorPane = loader.load();
ControllerFXMLTableView tabController = loader.getController();
TableColumn column = tabController.getColumnName();
编辑:为了便于以后使用,您可以定义一个适当的容器,aMap columns=new HashMap()代码>例如,并使用它:
columns.put(itemList,tabController.getColumnName())代码>我在每个选项卡上都有这个安可芬
,我应该保留那些控制器的列表还是什么?我的意图是,我只是在标签上添加了那些AnchorPane
。现在我唯一拥有的是选项卡窗格
,从这个窗格我得到选项卡,然后我更改(例如)列的名称。我想在离开循环后访问控制器。你可以将引用存储在列表
或映射
中。我认为有比存储引用更好的解决方案。
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);
}
}
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLTableView.fxml"));
AnchorPane anchorPane = loader.load();
ControllerFXMLTableView tabController = loader.getController();
TableColumn column = tabController.getColumnName();