【问题标题】:How To Print String representation of Color in Java如何在 Java 中打印颜色的字符串表示
【发布时间】:2012-03-02 16:38:33
【问题描述】:

我有一个大小为 n 的颜色数组。在我的程序中,团队的数量总是

private static Color[] TEAM_COLORS = {Color.BLUE, Color.RED, Color.CYAN, Color.GREEN, Color.ORANGE, Color.PINK};

当我在控制台中打印有关玩家的信息时,我想打印与他们相关联的颜色。当我打印颜色时,我得到了

java.awt.Color[r=...,g=...,b=...]. 

我知道这就是 Java 打印颜色的方式。我想知道是否有办法代替打印 BLUE、RED 等(所以是预定义的颜色字符串)。

【问题讨论】:

  • 如果RED 是 255,0,0,那么 254,0,0 的名称是什么?你期望有 16,777,216 个颜色名称吗?
  • 您在Color 类中使用的那些静态字段是为了方便和引用没有任何文本名称的Color 对象;它们是 RGB 值。
  • 我收回了这一点,仔细查看帖子让我意识到 OP 是在谈论预定义的颜色,而且数量有限。
  • @AndrewThompson - 是的,但它不会改变任何东西,Color 类中没有匹配的Strings。您必须自己进行映射。

标签: java tostring


【解决方案1】:

通过将名称也添加到枚举来扩展 @Jon_Skeet 回复。

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 回复,因为它是该内容的扩展......

【讨论】:

    【解决方案2】:

    一种选择是创建一个NamedColor 枚举:

    public enum NamedColor {
        BLUE(Color.BLUE),
        RED(Color.RED),
        ...;
    
        private final Color awtColor;
    
        private NamedColor(Color awtColor) {
            this.awtColor = awtColor;
        }
    
        public Color getAwtColor() {
            return awtColor;
        }
    }
    

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

    另一种选择是创建您自己的Map<Color, String>,并在您需要颜色的字符串表示时进行咨询。

    【讨论】:

    • @Jon_Skeet 我只是通过将colorName 也作为属性添加到枚举来扩展您的回复......这样一切都在一个地方。
    • @havexz:你可以这样做 - 但我通常只使用枚举名称,除非我有充分的理由不这样做。
    • @JonSkeet 我完全同意你的看法。扩展代码适用于所有字符串文字都不是代码外部的情况(特别是不担心多语言)。但是,如果我们有来自外部代码的字符串文字(基于语言),我们可以删除 colorName 成员变量并仅使用通过一些帮助程序类从外部源获取的 api。但是真的所有这些解决方案在选择之前都必须根据情况考虑。
    【解决方案3】:

    这是一种基于反射的方法:

    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
    

    演示:http://ideone.com/6cIBD


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

    【讨论】:

      【解决方案4】:

      您可以创建一个类来存储代表颜色名称的 String 以及 Color 本身。

      【讨论】:

        【解决方案5】:

        如果您希望将 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;
            }
        }
        

        【讨论】:

          【解决方案6】:

          您可以尝试使用 String.valueOf(color.getRGB())

          【讨论】:

            猜你喜欢
            • 2016-05-10
            • 1970-01-01
            • 2021-12-26
            • 2021-02-14
            • 1970-01-01
            • 2018-11-12
            • 1970-01-01
            • 2016-05-29
            • 1970-01-01
            相关资源
            最近更新 更多