我以为 JavaFX CSS 不支持数值变量。但后来我发现这个 答案有 16 个赞,所以我创建了一个简单的测试:
public class NewMain extends Application {
@Override
public void start(Stage primaryStage) {
var button = new Button("Button");
VBox root = new VBox(button);
root.getStylesheets().add(NewMain.class.getResource("test.css").toExternalForm());
Scene scene = new Scene(root, 100, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
和 CSS:
.root {
LABEL_PADDING_TOP: 0;
LABEL_PADDING_RIGHT: 0;
LABEL_PADDING_BOTTOM: 0;
LABEL_PADDING_LEFT: 5;
}
.button {
-fx-padding: LABEL_PADDING_TOP LABEL_PADDING_RIGHT LABEL_PADDING_BOTTOM LABEL_PADDING_LEFT;
-fx-background-color: green;
}
这就是我所拥有的:
2025 年 2 月 8 日下午 1:39:41 javafx.scene.CssStyleHelper calculateValue 警告:在从样式表文件:home/user/temp/test.css 中的规则“*.button”转换“-fx-padding”的值时捕获“java.lang.ClassCastException:类 java.lang.Double 无法转换为类 javafx.css.Size(java.lang.Double 位于加载器“bootstrap”的模块 java.base 中;javafx.css.Size 位于加载器“app”的模块 javafx.graphics@19 中)”
由于此功能对我来说非常重要,如果可能的话,我希望让它发挥作用。
不。
常问问题
这表明,对于较旧的 JavaFX 版本,变量替换数值在过去是有效的。但是,这样的功能从未公开记录过,因此它不受支持,我猜是无人维护的,因为您对最新 JavaFX 版本的测试表明它不起作用。
参考
JavaFX CSS 的当前参考资料是:
其中都没有提到或者使用变量来表示数值。
如何在 JavaFX CSS 中使用变量
使用 Java 或外部工具预处理 CSS。
您可以使用SASS预处理器来生成要使用的 CSS。SASS 支持变量。
或者,您可以使用 Java 代码动态生成 CSS。最好使用模板库(例如,您可以使用freemarker或命名占位符之类的东西)。模板本应在JEP465:字符串模板中添加到 JDK 中,但由于预览版存在需要使用其他方法解决的问题,因此该提案被撤回。它可能会添加到未来的某个 Java 版本中。鉴于未来的字符串模板可以添加到 Java 语言本身,并且可以处理 CSS,我认为向 JavaFX CSS 处理器添加通用变量类型功能似乎不值得。
以下是在代码中生成 CSS 的示例。该示例仅用于说明目的,不具有执行性(如果担心性能,请使用模板库)。
变量类事物
JavaFX CSS 中有些东西的作用有点像变量,但并不完全是变量。
查找颜色
JavaFX 具有查找颜色的概念,它充当颜色值的常量值,可以从中派生出其他颜色。这对于主题化非常有用。
em 值
JavaFX长度可以是
em
根据字体大小而变化的值。摩德纳建议如下使用它们:
根据字体大小缩放 UI 的示例:
似乎 CSS 解析器将值转换为错误的类型。尝试使用旧 java sdk 中的示例,该示例来自该问答发布时的情形。也许是因为新版本对值的转换/强制转换有所不同,而且更加“精致”和具体(典型的 java 玩家搞砸了)。可能是其他任何事情,但我首先要放弃这一点。然后您可以阅读这个问题,因为它涉及类似的转换问题:JavaFX - 在 css 中获取混合模式的类强制转换异常