【发布时间】:2014-08-05 14:44:02
【问题描述】:
如何从 Color 类的实例中获取表示颜色名称(而不是 awt RGB 代码)的字符串?
例如我有
Color black=Color.BLACK;
我想得到字符串"Black"。
我知道这应该可以使用 Java 反射实现,但我对它不是很熟悉。谢谢。
【问题讨论】:
标签: java reflection colors awt
如何从 Color 类的实例中获取表示颜色名称(而不是 awt RGB 代码)的字符串?
例如我有
Color black=Color.BLACK;
我想得到字符串"Black"。
我知道这应该可以使用 Java 反射实现,但我对它不是很熟悉。谢谢。
【问题讨论】:
标签: java reflection colors awt
Color 类只有少数非静态字段
name | type
----------+---------------
value | int
frgbvalue | float[]
fvalue | float[]
falpha | float
cs | java.awt.color.ColorSpace
并且这些字段都不存储颜色名称。它也没有任何方法可以检查您使用的颜色是否等于其预定义的颜色之一并存储在静态引用中,如
public final static Color black = new Color(0, 0, 0);
public final static Color BLACK = black;
但是没有什么能阻止你实现你自己的方法来为你做这件事。这种方法看起来像
public static Optional<String> colorName(Color c) {
for (Field f : Color.class.getDeclaredFields()) {
//we want to test only fields of type Color
if (f.getType().equals(Color.class))
try {
if (f.get(null).equals(c))
return Optional.of(f.getName().toLowerCase());
} catch (IllegalArgumentException | IllegalAccessException e) {
// shouldn't not be thrown, but just in case print its stacktrace
e.printStackTrace();
}
}
return Optional.empty();
}
使用示例
System.out.println(colorName(Color.BLACK).orElse("no name found"));
System.out.println(colorName(new Color(10, 20, 30)).orElse("no name found"));
System.out.println(colorName(null).orElse("no name found"));
输出:
black
no name found
no name found
【讨论】:
您可以使用预定义的map <Color, String> 在其上插入一些预定义的颜色,然后使用它来获取名称
HashMap<Color,String> hm = new HashMap <Color,String>();
hm.put(Color.BLACK,"Black");
.
.
.
hm.get(Color.BLACK)
【讨论】: