【发布时间】:2013-07-29 07:38:50
【问题描述】:
我在 JavaFX ColorPicker 中选择了颜色。现在我需要将它保存为十六进制字符串。我找到了this 方法,但对于JavaFX 不适用。 JavaFX 有自己的 Color 类,没有 getRGB() 方法,可以用作中介转换。
【问题讨论】:
我在 JavaFX ColorPicker 中选择了颜色。现在我需要将它保存为十六进制字符串。我找到了this 方法,但对于JavaFX 不适用。 JavaFX 有自己的 Color 类,没有 getRGB() 方法,可以用作中介转换。
【问题讨论】:
这个脆弱的解决方案完美地解决了问题:
// 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();
【讨论】:
这个 为我工作
MyColorPicker.getValue().toString().substring(2)
【讨论】:
whatEverObject.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();
}
由于浮点表示和强制转换,currently top voted answer 对于许多可能的Color 对象实际上并不安全。使用Math.round(...) 可以解决这个问题。
我使用Color.hsb(...) 方法使用随机双精度(来自Math.random())生成Color 对象。如果不使用Math.round(),则转换后的十六进制代码将关闭。如果您采用类似的方法来生成颜色,建议使用此方法,因为它更安全。
【讨论】:
目前接受的答案
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;
}
希望这能帮我解决我遇到的麻烦!
【讨论】:
0 * 255
您可以使用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();
}
}
【讨论】:
0 而不是00
我认为我有更好的解决方案。
希望对你有帮助。
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;
}
}
【讨论】:
将颜色转换为网页颜色代码:
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 ) );
}
}
【讨论】:
Color 值,此方法不安全。详情请见this answer。