如何更改Java FX节点';运行时的CSS样式类?

如何更改Java FX节点';运行时的CSS样式类?,java,css,javafx,Java,Css,Javafx,我有一个style.css文件,其中包含以下样式: .tab{ -fx-background-color:rgb(15,63,103); ... etc ... } .selectedTab{ -fx-background-color:rgb(52,105,155); ... etc ... } 当满足某些条件时,我试图在运行时更改按钮的css 我知道您可以通过键入css内联以下命令来设置样式: mBtn.setStyle("-fx-background-co

我有一个style.css文件,其中包含以下样式:

.tab{
    -fx-background-color:rgb(15,63,103);
    ... etc ...
}

.selectedTab{
    -fx-background-color:rgb(52,105,155);
    ... etc ...
}
当满足某些条件时,我试图在运行时更改按钮的css

我知道您可以通过键入css内联以下命令来设置样式:

mBtn.setStyle("-fx-background-color:rgb(15,63,103);");
虽然对我来说,这似乎不如在.css文件中引用样式干净

因此,我最初使用CSS设置按钮:

newBtn.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());
newBtn.getStyleClass().add("tab");
但后来,当我尝试使用以下方法更改它时:

mBtn.getStyleClass().removeAll();
mBtn.getStyleClass().add("selectedTab");
它不会改变。更改节点样式后是否需要刷新/重画节点

另外,一般来说,在JavaFX中设置样式的首选方式是什么。它是用setStyle(“…”)表示的;方法,或者是通过将其链接到样式表,或者是我没有考虑过的第三种方法

感谢您抽出时间:)


编辑:由用户用第一条注释解决。问题是removeAll()是一个删除所有指定为参数的元素的方法。我打算实际使用clear()函数。

查找
removeAll
的功能;对于
clear
提供的功能,它不是一个不同的名称。事实上,在这种情况下,它根本不会修改列表。如果有两种具有相同优先级的冲突样式,JavaFX只需选择其中一种。不过,使用
clear
可能不会产生预期的结果,因为这也会删除内部用于实现按钮正常外观的样式。圆角等。如果清除了这些样式类,也会消失。我无法重现这个问题,至少JavaFX14不会。请将您的问题提供给我们。请注意,
getStyleClass().removeAll()
实际上并不删除任何内容。该方法接受字符串的vararg(即数组),而您传递的是一个空数组。您的意图似乎很清楚,在这种情况下,您应该使用
clear()
。请记住,删除“button”样式类将导致
按钮
丢失modena.css应用的所有样式。@fabian我在css中认为,如果存在潜在冲突,样式表中稍后声明的样式将优先。您可能希望避免使用类名
选项卡
,当它被
TabPane
中的
Tab
元素使用时;因此,您可能会意外地选择您不打算选择的样式。使用
getStyleClass().remove(“tab”)
如果确定只添加了一次样式类(它将删除第一次出现的样式);使用
getStyleClass().removeAll(Collections.singleton(“tab”)
删除所有出现的
“tab”
。感谢指出“removeAll”不会删除任何内容的人。我看到它在intellisense中弹出,并假设它是“清晰的”。我正在添加样式“tab”,添加一个新样式“tabSelected”,然后切换回“tab”。由于“tab”已经添加,我从不清除它,切换回不起作用;对于
clear
提供的功能,它不是一个不同的名称。事实上,在这种情况下,它根本不会修改列表。如果有两种具有相同优先级的冲突样式,JavaFX只需选择其中一种。不过,使用
clear
可能不会产生预期的结果,因为这也会删除内部用于实现按钮正常外观的样式。圆角等。如果清除了这些样式类,也会消失。我无法重现这个问题,至少JavaFX14不会。请将您的问题提供给我们。请注意,
getStyleClass().removeAll()
实际上并不删除任何内容。该方法接受字符串的vararg(即数组),而您传递的是一个空数组。您的意图似乎很清楚,在这种情况下,您应该使用
clear()
。请记住,删除“button”样式类将导致
按钮
丢失modena.css应用的所有样式。@fabian我在css中认为,如果存在潜在冲突,样式表中稍后声明的样式将优先。您可能希望避免使用类名
选项卡
,当它被
TabPane
中的
Tab
元素使用时;因此,您可能会意外地选择您不打算选择的样式。使用
getStyleClass().remove(“tab”)
如果确定只添加了一次样式类(它将删除第一次出现的样式);使用
getStyleClass().removeAll(Collections.singleton(“tab”)
删除所有出现的
“tab”
。感谢指出“removeAll”不会删除任何内容的人。我看到它在intellisense中弹出,并假设它是“清晰的”。我正在添加样式“tab”,添加一个新样式“tabSelected”,然后切换回“tab”。由于“tab”已经被添加,而且我从不清除它,所以切换回“tab”不起作用。