Button JavaFX如何以编程方式设置选项卡关闭按钮的样式

Button JavaFX如何以编程方式设置选项卡关闭按钮的样式,button,javafx,tabs,styles,Button,Javafx,Tabs,Styles,我需要以编程方式设置javafx选项卡的关闭按钮的样式。 我的每个选项卡都从颜色集枚举中获取一种单独的颜色 myTab.setStyle("-fx-background-color:" + set.getBackgroundColor() + ";"); 有些颜色是深色的,有些是浅色的,所以我需要为tab close按钮设置不同的补色,如 myTab.getCloseButton().setStyle("-fx-background-color:" + set.getForegroundCol

我需要以编程方式设置javafx选项卡的关闭按钮的样式。 我的每个选项卡都从颜色集枚举中获取一种单独的颜色

myTab.setStyle("-fx-background-color:" + set.getBackgroundColor() + ";");
有些颜色是深色的,有些是浅色的,所以我需要为tab close按钮设置不同的补色,如

myTab.getCloseButton().setStyle("-fx-background-color:" + set.getForegroundColor() + ";");
但是我找不到一个方法来检索选项卡关闭按钮的句柄

我的CSS文件的一部分

.tab {
    -fx-background-insets: 0, 1, 2;
    -fx-background-radius: 0 0 0 0, 0 0 0 0, 0 0 0 0; /* eckig */
}
.tab .tab-close-button {
    -fx-shape: "M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z";
    -fx-scale-shape: false; 
}
我用不同的id为我的标签工作

myTab.setId("darktab");
myTab.setId("lighttab");
结合我的css文件中的单独条目

#darktab .tab-close-button { -fx-background-color: white; }
#lighttab .tab-close-button { -fx-background-color: black; }
但这是一个糟糕的解决方案,因为我需要许多互补色,或者枚举中所有定义的颜色

我错过什么了吗?有人知道如何控制制表符关闭按钮吗


我在设置下拉按钮和选项卡窗格的样式方面也有同样的问题。默认样式表(通常用于文本颜色)中的处理方式是使用查找颜色(
-fx background
)作为背景颜色,然后使用查找颜色作为对比色

梯形图功能的工作原理是根据提供的颜色的强度创建颜色渐变。例如,你可以做:

.tab{
-外汇背景插图:0,1,2;
-外汇背景半径:0,0,0,0,0;/*eckig*/
-fx背景色:选项卡背景;
标签背景:白色;
}
.tab.tab关闭按钮{
-外汇形状:“M19,6.41L17.59,512,10.596.41,55,6.4110.59,125,17.596.41,1912,13.4117.59,1919,17.5913.41,12z”;
-fx比例形状:假;
-fx背景色:梯形图(标签背景,白色49%,黑色50%);
}
.tab.tab标签{
-外汇文本填充:阶梯(标签背景,白色49%,黑色50%);
}
这定义了一种被称为
tab background
的查找颜色,该颜色适用于选项卡和所有子节点,并将选项卡的背景设置为该颜色。然后,选项卡关闭按钮的背景设置为梯形图功能确定的颜色:如果
选项卡背景的强度小于等于49%,则为白色;如果是50%或更多,则为黑色(中间有一个用于边界情况的渐变)。注意:相同的技术用于使文本在选项卡标签中可见

现在你可以做了

myTab.setStyle("tab-background:" + set.getBackgroundColor() + ";");
选项卡关闭按钮将根据选项卡背景的强度自动选择白色或黑色

SSCCE(上面显示的CSS文件为tab background.CSS):


谢谢,这对我有用。但重复我的最后一个问题-你知道我是否能为我的标签找到关闭按钮的手柄吗?
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.stage.Stage;

public class TabBackgroundTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Tab 1");
        tab1.setStyle("tab-background: white;");
        Tab tab2 = new Tab("Tab 2");
        tab2.setStyle("tab-background: black;");
        tabPane.getTabs().addAll(tab1, tab2);
        Scene scene = new Scene(tabPane, 600, 600);
        scene.getStylesheets().add("tab-background.css");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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