将Color 转换为十六进制字符串
您可以使用以下命令从Color 创建一个十六进制字符串:
private static String toHexString(Color color) {
int r = ((int) Math.round(color.getRed() * 255)) << 24;
int g = ((int) Math.round(color.getGreen() * 255)) << 16;
int b = ((int) Math.round(color.getBlue() * 255)) << 8;
int a = ((int) Math.round(color.getOpacity() * 255));
return String.format("#%08X", (r + g + b + a));
}
这还将包括颜色的 alpha(即不透明度)。请注意,JavaFX CSS Reference Guide 没有记录对 4 位/8 位十六进制值的任何支持:
RGB Hex: RGB 值的十六进制格式是一个“#”,紧跟三个或六个十六进制字符。三位 RGB 符号 (#rgb) 通过复制数字而不是添加零转换为六位形式 (#rrggbb)。例如,#fb0 扩展为 #ffbb00。这确保了白色 (#ffffff) 可以用简写符号 (#fff) 指定,并消除对显示颜色深度的任何依赖。
但是,Color#web(String) 的文档说支持以下格式:
带有可选的十六进制 alpha 通道的 HTML 长格式或短格式十六进制字符串 [强调]。十六进制值前面可以是 "0x" 或 "#",并且可以是 00 到 0xFF 范围内的 2 位数字或 0 到 F 范围内的单个数字。
另请注意,它表示十六进制值可能以 either 0x 或 # 为前缀。
以下是使用上述实用方法的示例:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
ColorPicker picker = new ColorPicker();
root.getChildren().add(picker);
picker.setOnAction(
event -> {
event.consume();
Color value = picker.getValue();
if (value == null) {
root.setStyle(null);
} else {
String style = String.format("-fx-background-color: %s;", toHexString(value));
root.setStyle(style);
}
});
primaryStage.setScene(new Scene(root, 500, 300));
primaryStage.setTitle("Color to Hexadecimal Example");
primaryStage.show();
}
private static String toHexString(Color color) {
int r = ((int) Math.round(color.getRed() * 255)) << 24;
int g = ((int) Math.round(color.getGreen() * 255)) << 16;
int b = ((int) Math.round(color.getBlue() * 255)) << 8;
int a = ((int) Math.round(color.getOpacity() * 255));
return String.format("#%08X", (r + g + b + a));
}
}
背景属性
还有另一种方法可以完成您正在做的事情。您可以直接设置Region#background 属性,而不是设置style,这需要将Color 转换为String。这是一个例子:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
ColorPicker picker = new ColorPicker();
root.getChildren().add(picker);
picker.setOnAction(
event -> {
event.consume();
Color value = picker.getValue();
if (value == null) {
root.setBackground(null);
} else {
root.setBackground(new Background(new BackgroundFill(value, null, null)));
}
});
primaryStage.setScene(new Scene(root, 500, 300));
primaryStage.setTitle("Programmatically Set Background Color Example");
primaryStage.show();
}
}