Javafx TabPane 具有多行选项卡

问题描述 投票:0回答:1

我想使用 (JavaFX) TabPane 来显示 20 个不同选项卡的内容。这适用于标准 TabPane,但是,当窗格点击一定数量的选项卡时,可以单击按钮/组合框来单击未看到的选项卡之一。

我正在设计一个将在触摸屏上使用的功能,所以这并不理想。我认为有两行独立的选项卡会更直观。

如何向 TabPane 添加两行选项卡,或者可以做什么来实现类似的效果?

这里有一些示例代码来重现我的意思:

public class TabTest extends Application {


public static void main(String args[]) {
    Application.launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Tabs Test");
    Group root = new Group();
    Scene scene = new Scene(root, 450, 250, Color.WHITE);

    TabPane tabPane = new TabPane();
    BorderPane borderPane = new BorderPane();

    for( int i = 0; i < 20; i++)
    {
        Tab tab = new Tab();
        tab.setText("Tab " + i);
        HBox hbox = new HBox();
        hbox.getChildren().add(new Label("Tab " + i));
        tab.setContent(hbox);
        tabPane.getTabs().add(tab);
    }

    borderPane.prefHeightProperty().bind(scene.heightProperty());
    borderPane.prefWidthProperty().bind(scene.widthProperty());

    borderPane.setCenter(tabPane);
    root.getChildren().add(borderPane);
    primaryStage.setScene(scene);
    primaryStage.show();
}

Image of tabbed view

java javafx javafx-8
1个回答
1
投票

TabPane
的选项卡标题区域基本上是一个StackPane,因此我认为创建两行选项卡而不是一行并不是那么容易。

我的想法是隐藏

TabPane
的原始选项卡,并将一组
ToggleButton
对象放入
ToggleGroup
中,然后将切换的选择与选项卡的选择绑定。

这样您就可以将“选项卡”添加到您想要的任何容器(流、网格等)中。

样本非常少:

Main.java

public class Main extends Application {

    TabPane tabPane;
    private ToggleGroup toggleGroup;

    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();
        Scene scene = new Scene(root, 700, 400, Color.WHITE);

        primaryStage.setTitle("Tabs Test");

        toggleGroup = new ToggleGroup();
        toggleGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {

            @Override
            public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
                if (newValue == null)
                    toggleGroup.selectToggle(oldValue);
                else
                    tabPane.getSelectionModel().select((Tab) newValue.getUserData());
            }
        });

        tabPane = new TabPane();
        tabPane.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

        VBox vboxToggleOuterContainer = new VBox();
        HBox hboxToggleFirstRow = new HBox();
        HBox hboxToggleSecondRow = new HBox();

        vboxToggleOuterContainer.getChildren().addAll(hboxToggleFirstRow, hboxToggleSecondRow);

        for (int i = 0; i < 20; i++) {
            Tab tab = new Tab();
            tab.setText("Tab " + i);
            HBox hbox = new HBox();
            hbox.getChildren().add(new Label("Tab " + i));
            tab.setContent(hbox);
            tabPane.getTabs().add(tab);

            ToggleButton tb = new ToggleButton("Tab" + i);
            tb.setToggleGroup(toggleGroup);
            tb.setUserData(tab);

            if (i < 10)
                hboxToggleFirstRow.getChildren().add(tb);
            else
                hboxToggleSecondRow.getChildren().add(tb);
        }

        toggleGroup.selectToggle(toggleGroup.getToggles().get(0));

        VBox vbox = new VBox();
        vbox.getChildren().addAll(vboxToggleOuterContainer, tabPane);
        vbox.fillWidthProperty().set(true);
        root.getChildren().add(vbox);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

application.css

.tab-pane {
    -fx-skin: "com.sun.javafx.scene.control.skin.TabPaneSkin";
    -fx-tab-min-height: 0;  
    -fx-tab-max-height: 0; 
}

.tab-pane .tab-header-area {
    -fx-padding: 0 0 0 0; 
}

.tab-pane .tab-header-area .headers-region .tab {

    -fx-padding: 0 0 1 0;
}

这个例子真的很小,只是展示了方法,你可以改进CSS,让控件变得更奇特(或者如果你愿意,如果我有时间,我也可以更新它)。

© www.soinside.com 2019 - 2024. All rights reserved.