如何从JavaFX ColorPicker颜色获取hex web String?

colors hex javafx rgb

15079 观看

6回复

6859 作者的声誉

我在JavaFX ColorPicker中选择了Color。现在我需要将其保存为十六进制字符串。我发现了这种方法,但对于JavaFX,它不适用。JavaFX有自己的Color类,没有getRGB()方法,可以用作mediatory转换。

作者: Zon 的来源 发布者: 2013 年 7 月 29 日

回应 (6)


2

2301 作者的声誉

您可以使用getGreen()getBlue()getRed()方法,并将其转换为十六进制。

    Color c;
    int green = c.getGreen()*255;
    Integer.toHexString(green);

重复此操作为红色和蓝色然后:

    String hexColor = "#"+red+green+blue;

这是一个想法,完整的代码(copy-pastable):

    public class TestColor {

        public TestColor() {
            Color c = Color.ALICEBLUE;

             int green = (int) (c.getGreen()*255);
             String greenString = Integer.toHexString(green);

             int red = (int) (c.getRed()*255);
             String redString = Integer.toHexString(red);

             int blue = (int) (c.getBlue()*255);
             String blueString = Integer.toHexString(blue);

             String hexColor = "#"+redString+greenString+blueString;
             System.out.println(hexColor);
             System.out.println(c.toString());
        }
        public static void main(String[] args) {
            new TestColor();
        }
    }
作者: Marc 发布者: 29.07.2013 01:39

2

6859 作者的声誉

决定

这样做的诀窍:

// 8 symbols.
String hex1 = Integer.toHexString(myColorPicker.getValue().hashCode()); 

// With # prefix.
String hex2 = "#" + Integer.toHexString(myColorPicker.getValue().hashCode()); 

// 6 symbols in capital letters.
String hex3 = Integer.toHexString(myColorPicker.getValue().hashCode()).substring(0, 6).toUpperCase();
作者: Zon 发布者: 29.07.2013 01:42

34

349 作者的声誉

将颜色转换为Web颜色代码:

public class FxUtils
{
    public static String toRGBCode( Color color )
    {
        return String.format( "#%02X%02X%02X",
            (int)( color.getRed() * 255 ),
            (int)( color.getGreen() * 255 ),
            (int)( color.getBlue() * 255 ) );
    }
}
作者: Moe 发布者: 14.09.2013 04:23

0

111 作者的声誉

我认为我有更好的解决方案。

希望能帮助到你。

import javafx.scene.paint.Color;

/**
 *
 * @author Marcos Martinewski Alves
 */
public class ColorUtils {

    public static String colorToHex(Color color) {
        return colorChanelToHex(color.getRed())
                + colorChanelToHex(color.getGreen())
                + colorChanelToHex(color.getBlue())
                + colorChanelToHex(color.getOpacity());
    }

    private static String colorChanelToHex(double chanelValue) {
        String rtn = Integer.toHexString((int) Math.min(Math.round(chanelValue * 255), 255));
        if (rtn.length() == 1) {
            rtn = "0" + rtn;
        }
        return rtn;
    }

}
作者: Marcos Supridatta 发布者: 05.03.2016 01:20

4

49 作者的声誉

目前接受的答案

return String.format("#%02X%02X%02X",
    ((int)color.getRed())*255,
    ((int)color.getGreen())*255,
    ((int)color.getBlue())*255);

目前可用的答案中最有效的答案是Zon(以下为参考)

// 8 symbols.
  String hex1 = Integer.toHexString(myColorPicker.getValue().hashCode());

// With # prefix.
  String hex2 = "#" + Integer.toHexString(myColorPicker.getValue().hashCode()); 

// 6 symbols in capital letters.
  String hex3 = Integer.toHexString(myColorPicker.getValue().hashCode()).substring(0, 6).toUpperCase();

但是,此方法会遇到自动删除开始零的问题。如果颜色的十六进制值以0开头(例如#000000,#00A3FF等),则将自动删除开头的零,使字符串太短而不能完全作为十六进制代码运行。Color.BLACK生成十六进制“#FF”,因为它只保持其不透明度。从JavaFX 8u112开始,下面的方法完全解决了颜色到十六进制的转换。

String colorToHex(Color color) {
    String hex1;
    String hex2;

    hex1 = Integer.toHexString(color.hashCode()).toUpperCase();

    switch (hex1.length()) {
    case 2:
        hex2 = "000000";
        break;
    case 3:
        hex2 = String.format("00000%s", hex1.substring(0,1));
        break;
    case 4:
        hex2 = String.format("0000%s", hex1.substring(0,2));
        break;
    case 5:
        hex2 = String.format("000%s", hex1.substring(0,3));
        break;
    case 6:
        hex2 = String.format("00%s", hex1.substring(0,4));
        break;
    case 7:
        hex2 = String.format("0%s", hex1.substring(0,5));
        break;
    default:
        hex2 = hex1.substring(0, 6);
    }
    return hex2;
}

希望这可以节省一些人我遇到的麻烦!

作者: OpenRenaissance 发布者: 31.10.2016 05:28

0

592 作者的声誉

浮点安全方法:

// Helper method
private String format(double val) {
    String in = Integer.toHexString((int) Math.round(val * 255));
    return in.length() == 1 ? "0" + in : in;
}

public String toHexString(Color value) {
    return "#" + (format(value.getRed()) + format(value.getGreen()) + format(value.getBlue()) + format(value.getOpacity()))
            .toUpperCase();
}

由于浮点表示和转换,当前最高投票答案对于许多可能的Color对象实际上并不安全。使用Math.round(...)修复此功能。

Color使用方法使用随机双打(从Math.random())生成对象Color.hsb(...)。不使用Math.round(),转换后的十六进制代码关闭。如果您采用类似的方法来生成颜色,建议使用此方法,因为它更安全。

作者: Kröw 发布者: 24.06.2019 09:28
32x32