可以在TabPane中制作不同宽度的标签吗?

时间:2015-06-30 23:03:14

标签: java javafx fxml

我试图在TabPane中的标签之间设置不同的宽度,但我无法弄清楚如何?我想要大约3个左右的标签,这可能吗?

干杯!

1 个答案:

答案 0 :(得分:0)

根据Jonny Henly的评论,我能够想出这个。我认为它符合您的描述。

您可以单独为Tab设置样式,这样您就可以循环浏览TabPane附带的所有标签,并在每个第n个标签上设置特殊样式。

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class TabGroups extends Application {

    @Override
    public void start(Stage stage) {

        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Tab 1");
        tab1.setContent(new Rectangle(200.0d, 200.0d, Color.LIGHTGREEN));
        Tab tab2 = new Tab("Tab 2");
        tab2.setContent(new Rectangle(200.0d, 200.0d, Color.LIGHTSTEELBLUE));
        Tab tab3 = new Tab("Tab 3");
        tab3.setContent(new Rectangle(200.0d, 200.0d, Color.LIGHTCORAL));

        Tab tabA = new Tab("Tab A");
        tabA.setStyle("-fx-background-color: cornsilk;");
        tabA.setContent(new Circle(100.0d, 100.0d, 100.0d, Color.BLUE));
        Tab tabB = new Tab("Tab B");
        tabB.setStyle("-fx-background-color: cornsilk;");
        tabB.setContent(new Circle(100.0d, 100.0d, 100.0d, Color.GREEN));
        Tab tabC = new Tab("Tab C");
        tabC.setStyle("-fx-background-color: cornsilk;");
        tabC.setContent(new Circle(100.0d, 100.0d, 100.0d, Color.YELLOW));

        Tab tabX = new Tab("Tab X");
        tabX.setContent(new TextField("This is " + tabX.getText()));
        Tab tabY = new Tab("Tab Y");
        tabY.setContent(new TextField("This is " + tabY.getText()));

        tabPane.getTabs().addAll(tab1, tab2, tab3, tabA, tabB, tabC, tabX, tabY);
        ObservableList<Tab> theTabs = tabPane.getTabs();

        // Add special CSS to every third tab.
        String addedStyle = "-fx-background-insets: 0 5em 0 0, 1 5em 1 1, 2 5em 0 0;"
                        + "-fx-padding: 0.083333em 5em 0.083333em 0.5em;";
        int counter = 1;
        for (Tab t : theTabs) {
            if ((counter % 3) == 0) {
                String existingStyle = t.getStyle();
                String newStyle;
                if (existingStyle != null) {
                    newStyle = existingStyle + addedStyle;
                } else {
                    newStyle = addedStyle;
                }
                t.styleProperty().setValue(newStyle);
            }
            counter++;
        }
        tabPane.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);

        StackPane layout = new StackPane();
        layout.getChildren().add(tabPane);
        Scene scene = new Scene(layout);

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

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

使用setStyle()方法将完全替换选项卡上存在的任何样式,因此,根据程序的主题,您可能希望获取现有样式并将任何更改附加到结尾。 (属性的最后一个设置会覆盖任何更早的内容。例如,样式可能会在属性列表的早期将背景设置为黑色,但稍后在列表中将其更改为白色将覆盖先前的设置。)此外,我不是CSS专家和下面使用的样式是有问题的,因为每个第三个选项卡的右边缘和下边缘都搞砸了。此外,第二个和第三个标签之间的间距混乱了。

希望有所帮助。