如何从JavaFX ColorPicker颜色获取十六进制网络字符串?

问题描述 投票:0回答:8

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

colors hex javafx rgb
8个回答
44
投票

将颜色转换为网页颜色代码:

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

11
投票

浮点安全方法:

// 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()
,转换后的十六进制代码就会关闭。如果您采用类似的方法来生成颜色,建议使用此方法,因为它更安全。


4
投票
当前接受的答案

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

希望这可以帮别人解决我所经历的麻烦!


3
投票
您可以使用

getGreen()

getBlue()
getRed()
 方法并将其转换为十六进制。

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

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

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

这就是想法,完整的代码(可复制粘贴):

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

2
投票
这个脆弱的解决方案完美地达到了目的:

// 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
投票
我认为我有更好的解决方案。

希望有帮助。

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

0
投票
我知道已经有一段时间了,但我发现 ColorPicker[Skin] 本身使用这个方法在按钮上显示值:

com.sun.javafx.scene.control.skin.Utils.formatHexString(Color c)


public static String formatHexString(Color c) { if (c != null) { return String.format((Locale) null, "#%02x%02x%02x", Math.round(c.getRed() * 255), Math.round(c.getGreen() * 255), Math.round(c.getBlue() * 255)); } else { return null; } }
    

-2
投票
这个 为我工作

MyColorPicker.getValue().toString().substring(2)
    
© www.soinside.com 2019 - 2024. All rights reserved.