如何在Java中打印颜色的字符串表示

如何在Java中打印颜色的字符串表示,java,tostring,Java,Tostring,我有一系列大小为n的颜色。在我的程序中,团队的数量总是一个选项是创建NamedColor枚举: 然后,将团队颜色数组设置为NamedColor值数组,而不是颜色值数组,并在需要时获取AWT颜色。枚举的默认toString实现是其名称 另一种选择是创建自己的地图,并在需要颜色的字符串表示时查阅地图。您可以尝试使用 String.valueOfcolor.getRGB您可以创建一个存储表示颜色名称的字符串以及颜色本身的类。如果您希望您的NamedColor用作java.awt.color,而您没有很

我有一系列大小为n的颜色。在我的程序中,团队的数量总是一个选项是创建NamedColor枚举:

然后,将团队颜色数组设置为NamedColor值数组,而不是颜色值数组,并在需要时获取AWT颜色。枚举的默认toString实现是其名称

另一种选择是创建自己的地图,并在需要颜色的字符串表示时查阅地图。

您可以尝试使用
String.valueOfcolor.getRGB

您可以创建一个存储表示颜色名称的字符串以及颜色本身的类。

如果您希望您的NamedColor用作java.awt.color,而您没有很多颜色,可以扩展它并存储名称

public class NamedColor extends java.awt.Color {

    private String name;

    public NamedColor(String name, java.awt.Color c) {
        super(c.getRGB());
        this.name = name;
    }

    public String toString() {
        return name;
    }
}

通过在枚举中添加名称来扩展@Jon_Skeet reply

public enum NamedColor {
  BLUE(Color.BLUE, "Blue"),
  RED(Color.RED, "Red"),
  ...;

  private final Color awtColor;
  private final String colorName;

  private NamedColor(Color awtColor, String name) {
    this.awtColor = awtColor;
    this.colorName = name;
  }

  public Color getAwtColor() {
    return awtColor;
  }

  public String getColorName() {
    return colorName;
  }
}

注意:如果投票,请也投票@Jon_Skeet reply,因为它是该方法的扩展…

以下是一种基于反射的方法:

public static String getColorName(Color c) {
    for (Field f : Color.class.getFields()) {
        try {
            if (f.getType() == Color.class && f.get(null).equals(c)) {
                return f.getName();
            }
        } catch (java.lang.IllegalAccessException e) {
            // it should never get to here
        } 
    }
    return "unknown";
}
示例:

getColorName(Color.BLACK); // black
getColorName(Color.BLUE); // blue
getColorName(new Color(0,1,2)); // unknown
演示:


这仅适用于中定义为字段的颜色,即:白色、浅灰色、灰色、深灰色、黑色、红色、粉色、橙色、黄色、绿色、品红、青色和蓝色。

如果红色为255,0,0,254,0,0的名称是什么?您希望使用16777216个颜色名称吗?为了方便起见,您使用的颜色类中的静态字段可能存在重复,并且引用没有任何文本名称的颜色对象;它们是RGB值。我收回这一点,更仔细地看这篇文章让我意识到OP谈论的是预定义的颜色,而且数量有限。@AndrewThompson-是的,但它没有改变任何东西,在Color类中没有匹配的字符串。你必须自己做映射。@Jon_Skeet我只是通过在枚举中添加colorName作为属性来扩展你的回答……这样所有的东西都在一个地方。@havexz:你可以这样做-但是我通常只使用枚举名,除非我有充分的理由不这样做。@Jonsket我完全同意你的看法。扩展代码适用于所有字符串文本不在代码外部的情况,特别是不担心多字符串的情况。但是如果我们有基于语言的来自外部代码的字符串文本,那么我们可以删除colorName成员变量,只使用通过某个帮助器类从外部源获取的api。但所有这些解决方案在选择之前都必须根据情况考虑。
public enum NamedColor {
  BLUE(Color.BLUE, "Blue"),
  RED(Color.RED, "Red"),
  ...;

  private final Color awtColor;
  private final String colorName;

  private NamedColor(Color awtColor, String name) {
    this.awtColor = awtColor;
    this.colorName = name;
  }

  public Color getAwtColor() {
    return awtColor;
  }

  public String getColorName() {
    return colorName;
  }
}
public static String getColorName(Color c) {
    for (Field f : Color.class.getFields()) {
        try {
            if (f.getType() == Color.class && f.get(null).equals(c)) {
                return f.getName();
            }
        } catch (java.lang.IllegalAccessException e) {
            // it should never get to here
        } 
    }
    return "unknown";
}
getColorName(Color.BLACK); // black
getColorName(Color.BLUE); // blue
getColorName(new Color(0,1,2)); // unknown