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

2024-03-03

如何使用 JavaFX/FXML 创建新选项卡?我已经在 FXML 中创建了一个选项卡,但我想单击一个按钮来显示一个新选项卡。

这是我的 FXML:

<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
             <MenuItem mnemonicParsing="false" text="New..." onAction="#btnNew"/>
             <MenuItem mnemonicParsing="false" text="Save..." />
             <MenuItem mnemonicParsing="false" text="Save As..." />
             <MenuItem mnemonicParsing="false" text="Open..." />
             <MenuItem mnemonicParsing="false" text="Close" />

        </items>
      </Menu>
      <Menu mnemonicParsing="false" text="Help">
        <items>
          <MenuItem mnemonicParsing="false" text="About Blank"  onAction="#btnAbout"/>
        </items>
      </Menu>
    </menus>
  </MenuBar>
</top>
<center>
  <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER" fx:id="tabPane">
    <tabs>
      <Tab text="Untitled Tab 1">
           <content>
              <AnchorPane>
                 <children>
                    <TextFlow maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" />
                 </children>
              </AnchorPane>
           </content>
        </Tab>
    </tabs>
  </TabPane>

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

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 文件 https://stackoverflow.com/questions/24598692/javafx-open-a-new-fxml-file-in-new-tab-dynamically http://javafx-albert-af77.blogspot.com/2012/06/tabs-fxml.html http://javafx-albert-af77.blogspot.com/2012/06/tabs-fxml.html https://www.youtube.com/watch?v=NhoiSMk3f5U https://www.youtube.com/watch?v=NhoiSMk3f5U


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

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

完整示例:

AddTabsExample.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Button?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="AddTabsController">
    <center>
        <TabPane fx:id="tabPane" />
    </center>
    <bottom>
        <HBox alignment="center">
            <Button text="Add tab" onAction="#addTab" />
            <Button text="List tabs" onAction="#listTabs" />
        </HBox>
    </bottom>
</BorderPane>

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 FXML 在 JavaFX 中动态创建选项卡? 的相关文章

随机推荐