从Color的实例获取表示颜色名称的字符串

时间:2014-06-15 17:53:11

标签: java reflection colors awt

如何从Color类的实例中获取表示颜色名称(而不是awt RGB代码)的String?

例如我有

Color black=Color.BLACK;

我希望得到字符串"Black"

我知道这应该可以使用Java反射,但我不是很熟悉它。谢谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用预定义的map <Color, String>在其上插入一些预定义颜色,然后使用它来获取名称

HashMap<Color,String> hm = new HashMap <Color,String>();
hm.put(Color.BLACK,"Black");
.
.
.
hm.get(Color.BLACK)