java - 如何在 javaFX 中将颜色从 ColorPicker 转换为 String 值
问题描述
我想让用户使用 ColorPicker 选择颜色,然后使用该颜色来更改按钮的颜色。JavaFX
ColorPicker cp = new ColorPicker();
cp.setOnAction(e -> {
Color c = cp.getValue();
System.out.println(c);
});
在 println 中,它会给出 0xe6e64dff,0xccffccff 之类的答案...
如果我想将按钮着色为蓝色,我需要使用它:
Button button = new Button();
button.setStyle("-fx-background-color: #ff0000; ");
所以我假设我必须先将颜色值转换为字符串才能使用它?或者我该怎么做?如何让选择的颜色在 setStyle 行中可用?
解决方案
转换Color
为十六进制字符串
您可以使用以下内容从 a 创建一个十六进制字符串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 参考指南没有记录对 4 位/8 位十六进制值的任何支持:
RGB Hex:十六进制表示法的 RGB 值的格式是一个“#”,后跟三个或六个十六进制字符。三位 RGB 符号 (#rgb) 通过复制数字而不是添加零转换为六位形式 (#rrggbb)。例如,#fb0 扩展为 #ffbb00。这确保了白色 (#ffffff) 可以用短符号 (#fff) 指定,并消除对显示器颜色深度的任何依赖。
但是,文档Color#web(String)
说支持以下格式:
带有可选十六进制 alpha 通道 的 HTML 长或短格式十六进制字符串[强调添加]。十六进制值可以以
"0x"
或开头,"#"
并且可以是 to 范围内的 2 位数字或 to 范围内00
的单个0xFF
数字。0
F
另请注意,它表示十六进制值可以以or 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));
}
}
背景属性
还有另一种方法可以完成你正在做的事情。您可以直接设置属性,而不是设置style
需要将 转换Color
为 a的 。这是一个例子:String
Region#background
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();
}
}
推荐阅读
- python - Numpy,将每行中的最大值更改为 1 而不会更改其他值
- html - MacOS 上的 Google Chrome 和 Safari 会在您将其拖放到所选文本之前抓取该字符
- django - 在点击 html 中的按钮并使用 DetailView (Django) 时使用户处于活动状态
- selenium-webdriver - 我找不到正确的 XPath 表达式来通过 selenium webdriver 将用户名和密码密钥发送到 Instragram 网站
- flutter - Flutter - 如何用对象旋转阴影?
- python - 支持绑定到本地地址的 Python 库(linux telnet 中的 --bind 选项)
- python - 获取 DataFrame 行的索引
- audio - 使用 ffmpeg [python soundfile] 从 opus 转换为 ogg 文件
- c - 为什么这会导致核心转储?
- debugging - TfidfVectorizer 分数存储在数据框中以标记为单个单词