首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将颜色从ColorPicker转换为javaFX中的字符串值

如何将颜色从ColorPicker转换为javaFX中的字符串值
EN

Stack Overflow用户
提问于 2020-02-27 20:18:51
回答 3查看 1.7K关注 0票数 0

我想让用户使用ColorPicker选择颜色,然后使用该颜色更改按钮的颜色。JavaFX

代码语言:javascript
复制
    ColorPicker cp = new ColorPicker();
            cp.setOnAction(e -> {
                Color c = cp.getValue();
                System.out.println(c);
            });

在println中它会给出像0xe6e64dff,0xccffccff这样的答案。

如果我想把按钮涂成蓝色,我需要用这个:

代码语言:javascript
复制
    Button button = new Button();
    button.setStyle("-fx-background-color: #ff0000; ");

因此,我假设我必须将颜色值转换为字符串,然后才能使用它?或者我该怎么做?如何使选定的颜色在setStyle行中可用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-28 01:11:57

Color转换为十六进制字符串

可以使用以下方法从Color创建十六进制字符串

代码语言:javascript
复制
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""#",可以是范围000xFF中的2位数字,也可以是range 0 to F中的一位数字。

还请注意,它表示十六进制值可能以0x#作为前缀。

下面是一个使用上述实用程序方法的示例:

代码语言:javascript
复制
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属性。下面是一个例子:

代码语言:javascript
复制
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();
  }
}
票数 8
EN

Stack Overflow用户

发布于 2020-02-27 20:32:46

找到了答案:

代码语言:javascript
复制
            cp.setOnAction(e -> {
            Color c = cp.getValue();
            button.setStyle("-fx-background-color: " + c.toString().replace("0x", "#"));
            System.out.println(c);
        });
票数 -1
EN

Stack Overflow用户

发布于 2021-12-06 15:52:07

当您只需要获取从JavaFX ColorPicker生成的颜色值并将其分配给CSS属性时,这实际上并不复杂。

在OnAction事件中,添加以下代码以确保提取前三对十六进制值,然后将它们格式化为CSS友好格式,如下所示:

代码语言:javascript
复制
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来实现这一点:

代码语言:javascript
复制
if (!cssFormat.isEmpty()) {
  button.setStyle("-fx-background-color: " + cssFormat);
}

就这么简单。

如果您需要将该字符串转换回颜色,您可以这样做:

代码语言:javascript
复制
Color color = Color.valueOf(colorString);

:-)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60441144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档