Java: создание массива предопределенных цветов - PullRequest
0 голосов
/ 29 февраля 2020

I sh для создания массива всех цветов, предварительно определенных в java .awt.Color, для случайного выбора одного из них.

Моя текущая лучшая попытка:

`           Color[] colors = Color.getClass().getEnumConstants();

, который был предложен в верхнем ответе на вопрос: Класс цвета в Java

, но при этом возникает ошибка:

Невозможно сделайте статическую c ссылку на нестатический c метод getClass () из типа Object

Конструктор, в котором сделан ошибочный вызов, приведен ниже:

private Ball() {
    Random initialSetter = new Random();
    ballX = marginSize + initialSetter.nextInt(xSize - 2 * marginSize);
    ballY = marginSize + initialSetter.nextInt(ySize - 2 * marginSize);
    ballXV = initialSetter.nextInt(doubleMaxV) - doubleMaxV/2;
    ballYV = initialSetter.nextInt(doubleMaxV) - doubleMaxV/2;
    Color[] colors = Color.getClass().getEnumConstants();
    color = colors[initialSetter.nextInt(colors.length)];
}

Замена ".getClass (). GetEnumConstants ()" на ".values ​​()" приводит к такой же ошибке (stati c ссылка на метод non-stati c).

1 Ответ

0 голосов
/ 29 февраля 2020

Чтобы исправить вашу немедленную ошибку, вы можете сделать:

Color[] colors = Color.class.getEnumConstants();

Но это работает, только если Color является перечислением. Согласно вашим комментариям, Color относится к java.awt.Color, что не является перечислением. Первый способ, предложенный связанным ответом, совершенно неправильный (может быть, это было 6 лет go?).

Насколько я знаю, лучшее, что вы можете здесь сделать, это перечислить их все. Там не так много - всего 13. Не похоже, что это число изменится в ближайшее время, так как AWT довольно стар, они вряд ли добавят новые цвета на этом этапе.

Для развлечения (это только для удовольствия), вы можете сделать это с отражением:

List<Color> colors = Arrays.stream(Color.class.getFields())
        // fields of type Color, and in all caps, snake case
        .filter(x -> x.getType() == Color.class && x.getName().matches("[A-Z_]+"))
        .map(x -> {
            try {
                return (Color)x.get(null);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                return Color.BLACK;
            }
        }).collect(Collectors.toList());

Обратите внимание, что отражение действительно медленное, поэтому ваш лучший выбор - жестко закодировать его .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...