Как напечатать строковое представление цвета в Java - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть массив цветов размера n. В моей программе количество команд всегда <= n, и мне нужно назначить каждой команде уникальный цвет. Это мой массив цветов: </p>

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

Когда я печатаю информацию о плеерах в консоли, я хочу напечатать, какой цвет связан с ними. Когда я печатаю цвет, я получаю

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

Я понимаю, что именно так Java печатает цвета. Мне было интересно, есть ли способ вместо этого печатать СИНИЙ, КРАСНЫЙ и т. Д. (Так предопределенная цветная строка).

Ответы [ 6 ]

3 голосов
/ 11 октября 2012

Вот подход, основанный на отражении:

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, а именно: белый, светло-серый, серый, темно-серый, черный, красный, розовый, оранжевый, желтый, зеленый, пурпурный, голубой и синий.

3 голосов
/ 10 февраля 2012

Один из вариантов - создать NamedColor enum:

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> и обращение к нему, когда вам нужно строковое представление для цвета.

2 голосов
/ 10 февраля 2012

Расширение ответа @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, так как это продолжение ...

1 голос
/ 10 февраля 2012

Если вы хотите, чтобы ваш 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;
    }
}
1 голос
/ 10 февраля 2012

Вы можете создать класс, который будет хранить как String, представляющий имя цвета, так и сам Color.

0 голосов
/ 10 февраля 2012

Вы можете попробовать использовать String.valueOf (color.getRGB ())

...