如何使用FXML在JavaFX中动态创建选项卡?

如何使用JavaFX / FXML创建新选项卡? 我在FXML中创建了一个tabpane,但我想点击一个按钮,导致出现一个新标签。

这是我的FXML:

                                        

这是我在我的控制器中正在尝试的代码:

 package sample; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; import java.net.URL; import java.util.ResourceBundle; public class Controller implements Initializable { @FXML private Button btnAbout; @FXML private Button btnNew; @FXML private TabPane tabPane; //tab array int intTabs = 0; Tab[] openTabs; @FXML private void btnNew(ActionEvent event){ try{ intTabs++; openTabs = new Tab[intTabs]; //System.out.println(openTabs.length); tabAdder(intTabs, openTabs); }catch(Exception e){ e.printStackTrace(); } } private TabPane tabAdder(int tabNum, Tab[] tabs){ //System.out.println(tabNum); tabPane.getTabs().add(tabs[tabNum]); return tabPane; } @FXML private void btnAbout(ActionEvent event){ Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Blank: Information"); alert.setHeaderText(null); alert.setContentText("This is Blank, a simple and soon to be elegant cross platform text editor."); alert.showAndWait(); } public void initialize(URL url, ResourceBundle rb){ //tabPane.getTabs().add } 

}

我不太确定问题是什么我一直在经历一堆资源,我知道如何添加常规标签。

我知道如果我制作这样的标签:

 Tab fapTab = new Tab(); 

我可以像这样添加它:

 tabPane.getTabs().add(fapTab); 

但我想动态创建它们,因为我不知道用户需要多少个选项卡。 因此,我的方法是创建一个选项卡数组,只要用户单击“新”,然后使用一个将新选项卡添加到gui的函数,该选项卡就会变大。 它不起作用,我尝试了几种不同的方法,使人们的代码适应我自己。

所以我的问题是有谁知道我做错了什么?

以下是其中一些来源: javafx动态地在新标签中打开一个新的fxml文件 http://javafx-albert-af77.blogspot.com/2012/06/tabs-fxml.html https://www.youtube.com/手表?ν= NhoiSMk3f5U

您已经给出了答案:只需创建一个新选项卡并将其添加到选项卡窗格:

 Tab tab = new Tab(); tabPane.getTabs().add(tab); 

完整的例子:

AddTabsExample.fxml:

       

AddTabsController.java:

 import javafx.fxml.FXML; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; public class AddTabsController { @FXML private TabPane tabPane ; public void initialize() { tabPane.getTabs().add(new Tab("Tab 1")); } @FXML private void addTab() { int numTabs = tabPane.getTabs().size(); Tab tab = new Tab("Tab "+(numTabs+1)); tabPane.getTabs().add(tab); } @FXML private void listTabs() { tabPane.getTabs().forEach(tab -> System.out.println(tab.getText())); System.out.println(); } } 

应用程序(AddTabsExample.java):

 import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class AddTabsExample extends Application { @Override public void start(Stage primaryStage) throws Exception { BorderPane root = FXMLLoader.load(getClass().getResource("AddTabsExample.fxml")); primaryStage.setScene(new Scene(root, 800, 600)); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

改用它。 你必须@Override初始化方法:

 @Override public void initialize(URL location, ResourceBundle resources) { tabPane.getTabs().add(new Tab("Tab 1")); } //Not this: public void initialize() { tabPane.getTabs().add(new Tab("Tab 1")); }