Как преобразовать цвет из ColorPicker в значение String в javaFX - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу, чтобы пользователь выбирал цвет с помощью 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; ");

Итак, я предполагаю, что мне придется преобразовать значение цвета в строку, прежде чем я смогу его использовать? Или как я go об этом? Как получить выбранный цвет для использования в строке setStyle?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Преобразование 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();
  }
}
0 голосов
/ 27 февраля 2020

Нашел ответ:

            cp.setOnAction(e -> {
            Color c = cp.getValue();
            button.setStyle("-fx-background-color: " + c.toString().replace("0x", "#"));
            System.out.println(c);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...