Colors 如何从JavaFX ColorPicker color获取十六进制web字符串?

Colors 如何从JavaFX ColorPicker color获取十六进制web字符串?,colors,hex,javafx,rgb,Colors,Hex,Javafx,Rgb,我在JavaFX ColorPicker中选择了颜色。现在我需要将其保存为十六进制字符串。我找到了方法,但对于JavaFX它不适用。JavaFX有自己的颜色类,没有getRGB()方法,可以用作中介转换。您可以使用getGreen(),getBlue(),getRed()方法并将其转换为十六进制 Color c; int green = c.getGreen()*255; Integer.toHexString(green); 对红色和蓝色重复此步骤,然后: S

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

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

    Color c;
    int green = c.getGreen()*255;
    Integer.toHexString(green);
对红色和蓝色重复此步骤,然后:

    String hexColor = "#"+red+green+blue;
这就是想法,完整的代码(可复制):


这种脆弱的解决方案完美地实现了这一点:

// 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();

将颜色转换为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 ) );
    }
}

我想我有一个更好的解决办法

希望能有帮助

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;
    }

}

目前接受的答案是

return String.format("#%02X%02X%02X",
    ((int)color.getRed())*255,
    ((int)color.getGreen())*255,
    ((int)color.getBlue())*255);
在目前可用的答案中,最有效的答案是Zon的(以下供参考)

但是,这种方法会遇到自动删除起始零的问题。如果颜色的十六进制值以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;
}

希望这能帮别人省去我所经历的麻烦

浮点安全方法:

// 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(…)
解决了这个问题

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

此方法 为我工作

MyColorPicker.getValue().toString().substring(2)

这里的答案中唯一的一个变体适用于黑色和其他简单颜色,没有例外。由于浮点表示,这种方法对于许多可能的
颜色
值是不安全的。有关详细信息,请参阅。这是一个脆弱的解决方案。哈希代码的生成依赖于实现,因此不能确保在以后的版本中它能正常工作。(例如,如果哈希代码中包含另一个字段,例如opacy。)依赖hashCode()的实现是不明智的,因为API中没有指定实现。这不起作用。如果任何组件都是零,那么它将是
0
而不是
00
。您的第一个解决方案在每个Java版本上只生成零,因为强制转换具有更高的优先级,因此您基本上总是将
0*255
相乘,因此不鼓励只使用代码的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。您可以这样使用:String hexcolor=MyColorPicker.getValue().toString().substring(2);我想说的是,当您想要获取ColorPicker的值作为字符串时,您可以尝试这个bcz,get getValue()将返回以0x开头的值。。。。子字符串(2)将删除该0x,以便根据
whatEverObject获得正确的colorno值。toString()
总是错误的
// 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();
}
MyColorPicker.getValue().toString().substring(2)