Преобразование 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));
}
Это также будет включать в себя альфа (то есть непрозрачность) ) цвета. Обратите внимание, что Справочное руководство JavaFX CSS не документирует поддержку четырехзначных / 8-ди git шестнадцатеричных значений:
RGB Hex: Формат значения RGB в шестнадцатеричном формате - «#», за которым сразу следуют три или шесть шестнадцатеричных символов. Трехзначная git RGB-нотация (#rgb) преобразуется в шестизначную git форму (#rrggbb) путем репликации цифр, а не путем добавления нулей. Например, # fb0 расширяется до # ffbb00. Это гарантирует, что белый цвет (#ffffff) может быть указан в короткой записи (#fff), и устраняет любые зависимости от глубины цвета дисплея.
Однако документация по Color#web(String)
говорит, что поддерживается следующий формат:
Шестнадцатеричная строка длинного или короткого формата HTML с необязательный шестнадцатеричный альфа-канал [выделение добавлено] . Шестнадцатеричным значениям может предшествовать либо "0x"
, либо "#"
, и они могут состоять из 2 цифр в диапазоне от 00
до 0xFF
или одного ди git в диапазоне от 0
до F
.
Также обратите внимание, что шестнадцатеричное значение может начинаться с префикса либо 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));
}
}
Свойство фона
Есть еще один способ выполнить sh то, что вы делаете. Вместо установки 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();
}
}