JavaFX如何通过颜色选择器正确设置Pane面板背景颜色
问题原因
Color类默认toString()输出的是0xAARRGGBB格式字符串,不符合JavaFX CSS的颜色语法要求:CSS颜色值必须以#开头,且十六进制颜色默认通道顺序为RGBA,和Color输出的ARGB顺序不匹配,因此触发解析警告,样式无法生效。
注意不要直接把字符串开头的0x替换为#就使用,这种方式没有修正通道顺序,会导致颜色显示完全错误,比如不透明红色Color.RED的toString()结果是0xff0000ff,替换前缀后得到#ff0000ff,会被CSS解析为不透明蓝色。
解决方案
方案1:调用原生背景API设置(推荐)
不需要拼接CSS字符串,Pane的setBackground方法原生支持直接传入Color类型值,类型安全,不存在格式错误问题:
import javafx.geometry.Insets; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; import javafx.scene.paint.Color; Color newColour = backgroundColourPicker.getValue(); // 无圆角、无额外内边距,颜色填充整个Pane区域 canvas.setBackground(new Background(new BackgroundFill( newColour, CornerRadii.EMPTY, Insets.EMPTY )));
如果需要给画布设置圆角,把CornerRadii.EMPTY替换为对应圆角参数的CornerRadii实例即可。
方案2:转换为合法CSS颜色格式后拼接样式
如果必须使用setStyle方法编写CSS,可以手动将Color对象按RGBA顺序转换为#RRGGBBAA格式的合法CSS颜色值再拼接:
Color newColour = backgroundColourPicker.getValue(); // 按RGBA通道顺序转换为#开头的8位十六进制颜色值 String cssColor = String.format("#%02X%02X%02X%02X", (int) Math.rint(newColour.getRed() * 255), (int) Math.rint(newColour.getGreen() * 255), (int) Math.rint(newColour.getBlue() * 255), (int) Math.rint(newColour.getOpacity() * 255) ); canvas.setStyle("-fx-background-color: " + cssColor + ";");
代码里用Math.rint处理通道值是为了避免浮点数精度问题导致颜色值偏差。
内容的提问来源于stack exchange,提问作者Shenavyre
相关产品推荐
相关产品推荐

