我想让用户使用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行中可用?
发布于 2020-02-28 01:11:57
将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参考指南不记录对4位/8位十六进制值的任何支持:
RGB:十六进制表示法中RGB值的格式是‘#’,后面紧跟三个或六个十六进制字符。三位RGB表示法(#rgb)通过复制数字而不是通过添加零来转换为六位格式(#rrggbb)。例如,#fb0扩展为#ffbb00。这可以确保白色(#ffffff)可以用简短的表示法(#fff)指定,并消除对显示的颜色深度的任何依赖。
但是,Color#web(String)的文档显示支持以下格式:
一个HTML长或短格式十六进制字符串与,一个可选的十六进制阿尔法通道的重点添加。十六进制值之前可以是
"0x"或"#",可以是范围00到0xFF中的2位数字,也可以是range0toF中的一位数字。
还请注意,它表示十六进制值可能以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转换为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();
}
}发布于 2020-02-27 20:32:46
找到了答案:
cp.setOnAction(e -> {
Color c = cp.getValue();
button.setStyle("-fx-background-color: " + c.toString().replace("0x", "#"));
System.out.println(c);
});发布于 2021-12-06 15:52:07
当您只需要获取从JavaFX ColorPicker生成的颜色值并将其分配给CSS属性时,这实际上并不复杂。
在OnAction事件中,添加以下代码以确保提取前三对十六进制值,然后将它们格式化为CSS友好格式,如下所示:
String colorString = String.valueOf(colorPicker.getValue());
String regex = "([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(colorString);
StringBuilder cssFormat = new StringBuilder();
if (m.find()) {
cssFormat.append("#").append(m.group(0)).append(";");
}在本例中,名为cssFormat的字符串将能够插入到您需要分配给它的任何JavaFX对象的样式中。下面是如何按照OP的要求使用Button来实现这一点:
if (!cssFormat.isEmpty()) {
button.setStyle("-fx-background-color: " + cssFormat);
}就这么简单。
如果您需要将该字符串转换回颜色,您可以这样做:
Color color = Color.valueOf(colorString);:-)
https://stackoverflow.com/questions/60441144
复制相似问题