如何修复JavaFX解析CSS时出现的错位'expected RBRACE'错误?
JavaFX CSS变量使用报错修复方案
报错信息
Mar 26, 2023 11:16:27 PM javafx.css.CssParser parse WARNING: CSS Error parsing jar:file:///D:/Projects/jfxtest3/build/libs/jfxtest3-1.0-SNAPSHOT.jar!/com/example/jfxtest3/main.css: Expected RBRACE at [4,4]
问题代码
:root { --rosewatercol: #f5e0dc; --flamingocol: #f2cdcd; <-- according to the error, there should be a closed bracket at pos 4 in this line --pinkcol: #f5c2e7; --mauvecol: #cba6f7; --redcol: #f38ba8; --marooncol: #eba0ac; --peachcol: #fab387; --yellowcol: #f9e2af; --greencol: #a6e3a1; --tealcol: #94e2d5; --skycol: #89dceb; --sapphirecol: #74c7ec; --bluecol: #89b4fa; --lavendercol: #b4befe; --accentcol: --tealcol; --textcol: #cdd6f4; --subtext1col: #bac2de; --subtext0col: #a6adc8; --overlay2col: #9399b2; --overlay1col: #7f849c; --overlay0col: #6c7086; --surface2col: #585b70; --surface1col: #45475a; --surface0col: #313244; --basecol: #1e1e2e; --mantlecol: #181825; --crustcol: #11111b; } .root { -fx-background-color: linear-gradient(from 0% 0% to 100% 100%, #181825, #1e1e2e); -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; } .root * { -fx-font-size: 18; -fx-text-fill: --textcol; -fx-fill: --textcol; -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; -fx-background-radius: 12; } .button { -fx-background-color: --surface0col; -fx-font-size: 18; -fx-text-fill: --textcol; -fx-fill: --textcol; } .button:hover { -fx-background-color: --surface1col; } .vbox { -fx-background-color: --surface0col; } .hbox { -fx-background-color: --surface0col; } .accordion { -fx-background-color: --surface0col; } .titled-pane > .title { -fx-background-color: --surface0col; -fx-background-insets: 0; -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; } .titled-pane > .title > *.text { -fx-fill: #fff; } .titled-pane > .content { -fx-background-color: --surface0col; -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; }
错误原因及修复方法
1. 非法注释导致解析混乱
代码中--flamingocol: #f2cdcd; <-- according to the error...这一行的注释格式完全错误,JavaFX CSS仅支持/* 注释内容 */格式的注释,这种HTML转义的行内内容会被解析器判定为无效代码,进而引发位置匹配混乱的报错。
修复:直接删除该行的注释内容,或改为合法的CSS注释:
--flamingocol: #f2cdcd; /* 原注释内容 */
2. 变量引用语法错误
JavaFX CSS中引用自定义变量必须使用var(--变量名)的语法,直接书写--变量名会被解析为无效的属性值,导致CSS解析失败。
修复:所有使用变量的位置都要包裹在var()中,示例:
- 错误写法:
-fx-text-fill: --textcol; - 正确写法:
-fx-text-fill: var(--textcol);
3. 变量赋值其他变量的语法错误
当一个变量的值依赖另一个变量时,同样需要用var()包裹目标变量,否则会被解析为普通字符串而非变量引用。
修复:将--accentcol: --tealcol;改为:
--accentcol: var(--tealcol);
修复后的完整代码
:root { --rosewatercol: #f5e0dc; --flamingocol: #f2cdcd; --pinkcol: #f5c2e7; --mauvecol: #cba6f7; --redcol: #f38ba8; --marooncol: #eba0ac; --peachcol: #fab387; --yellowcol: #f9e2af; --greencol: #a6e3a1; --tealcol: #94e2d5; --skycol: #89dceb; --sapphirecol: #74c7ec; --bluecol: #89b4fa; --lavendercol: #b4befe; --accentcol: var(--tealcol); --textcol: #cdd6f4; --subtext1col: #bac2de; --subtext0col: #a6adc8; --overlay2col: #9399b2; --overlay1col: #7f849c; --overlay0col: #6c7086; --surface2col: #585b70; --surface1col: #45475a; --surface0col: #313244; --basecol: #1e1e2e; --mantlecol: #181825; --crustcol: #11111b; } .root { -fx-background-color: linear-gradient(from 0% 0% to 100% 100%, #181825, #1e1e2e); -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; } .root * { -fx-font-size: 18; -fx-text-fill: var(--textcol); -fx-fill: var(--textcol); -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; -fx-background-radius: 12; } .button { -fx-background-color: var(--surface0col); -fx-font-size: 18; -fx-text-fill: var(--textcol); -fx-fill: var(--textcol); } .button:hover { -fx-background-color: var(--surface1col); } .vbox { -fx-background-color: var(--surface0col); } .hbox { -fx-background-color: var(--surface0col); } .accordion { -fx-background-color: var(--surface0col); } .titled-pane > .title { -fx-background-color: var(--surface0col); -fx-background-insets: 0; -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; } .titled-pane > .title > *.text { -fx-fill: #fff; } .titled-pane > .content { -fx-background-color: var(--surface0col); -fx-border-style: none; -fx-border-width: 0; -fx-border-insets: 0; }
内容的提问来源于stack exchange,提问作者Luh0
相关产品推荐
相关产品推荐

