powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Покритикуйте метод для внутренних нужд
14 сообщений из 14, страница 1 из 1
Покритикуйте метод для внутренних нужд
    #39312421
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Тема несколько похожа на недавнюю, все еще в топе, тему "Как сравнить int с множеством значений на равенство", но решил отдельно создать.

Есть у меня заданный в css список цветов, который вызывается в коде по названию цвета.
Используется для раскрашивания таблиц, лейблов, фонов и т.д.

Чтобы не вспоминать каждый раз, как правильно написать название цвета, решил создать метод, который возвращает название по номеру.

Каким бы способом вы решили такую задачу (значительного роста кол-ва цветов не ожидается, этих за глаза уже) и насколько у меня в коде все плохо? ))

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
public class ColorUtil {

    public static final ColorUtil INSTANCE = new ColorUtil();

    private final HashMap<Integer, String> hashtable = new HashMap<>();

    public ColorUtil() {
        hashtable.put(0, "red");
        hashtable.put(1, "lightred");
        hashtable.put(2, "amaranthPink");
        hashtable.put(3, "brightOrangeYellow");
        hashtable.put(4, "lightorange");
        hashtable.put(5, "paleOrangeYellow");
        hashtable.put(6, "rapeseedYellow");
        hashtable.put(7, "yellow");
        hashtable.put(8, "brightYellow");
        hashtable.put(9, "lemonChiffon");
        hashtable.put(10, "green");
        hashtable.put(11, "irishGreen");
        hashtable.put(12, "paleGreen");
        hashtable.put(13, "brightGreen");
        hashtable.put(14, "blue");
        hashtable.put(15, "cyan");
        hashtable.put(16, "lightBlue");
        hashtable.put(17, "magenta");
        hashtable.put(18, "halfMagenta");
        hashtable.put(19, "paleMagenta");
        hashtable.put(20, "darkGray");
        hashtable.put(21, "gray");
        hashtable.put(22, "lightGray");
    }

    /**
     *
     * @param colorNum key in hashTable
     * @return 0 = red; 1 = lightred; 2 = amaranthPink; 3 = brightOrangeYellow;
     * 4 = lightorange; 5 = paleOrangeYellow; 6 = rapeseedYellow; 7 = yellow; 8
     * = brightYellow; 9 = lemonChiffon; 10 = green; 11 = irishGreen; 12 =
     * paleGreen; 13 = brightGreen; 14 = blue; 15 = cyan; 16 = lightBlue; 17 =
     * magenta; 18 = halfMagenta; 19 = paleMagenta; 20 = darkGray; 21 = gray; 22
     * = lightGray;
     */
    @SuppressWarnings("empty-statement")
    public String getColorName(int colorNum) {
        String colorName = "";
        try {
            colorName = hashtable.get(colorNum);;
        } catch (NullPointerException e) {
            System.out.println("key of color not found in hashMap: " + e);
        }
//        System.out.println(colorNum + " = " + colorName + ";");
        return colorName;
    }

    public static void main(String[] args) {
        ColorUtil colorUtil = ColorUtil.INSTANCE;
//        for (int i = 0; i <= 22; i++) {
//            colorUtil.getColorName(i);
//        }
        colorUtil.getColorName(2);
    }
}

...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312441
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enum

PS: зачем цвета обозхначать номерами?
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312452
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicЧтобы не вспоминать каждый раз, как правильно написать название цвета, решил создать метод, который возвращает название по номеру.

Как CSS связан с Java? В современно CSS есть куча способов реюзать стили.
http://oocss.org/spec/css-mixins.html

NixicКаким бы способом вы решили такую задачу

Взял бы любую базу имен и конвертнул
https://en.wikipedia.org/wiki/X11_color_names

Nixic насколько у меня в коде все плохо? ))

Util в имени класса это уже повод задуматься. У вас же Map какой-то, а не Util.
Почему мапится int а не RGB? Что за номер вообще? Откуда берется?
Почему конструктор публичный?
Почему HashMap модифицируемый?
Почему ловится NullPointerException ?
Почему логирует в System.out?
В общем, высокая частота WTF per code line.
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312460
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominenum

PS: зачем цвета обозхначать номерами?
Просто мне удобно, нажать контрол+пробел, посмотреть хелп и выбрать номер, нежели писать "paleOrangeYellow" и т.д.
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312469
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так-то вот сейчас подумал, нафига оно вообще надо, действительно.
сейчас как происходит:

к примеру раскрашивание таблицы

productTable.setCellStyleGenerator(new Table.CellStyleGenerator() {...
if (что-то там с данными) {
return "green";
}
и т.д. по цветам, в зависимости от данных, красится в какой-нибудь цвет.

Просто бывают сложные условия и просто забываешь список цветов, которые вообще есть, вот хотел в хелп по методу заглядывать и выбирать цвет соответствующий цифре. С другой стороны код получается странный, придется каждый раз смотреть, что же означает 13 и т.д.
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312514
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал немного.
Остались вопросы, как использовать enam, чтобы не по названию цвета брать название, а по какой-нибудь короткой константе, например по тому же номеру.
Номера берутся из головы, по порядку, до 20 я считать умею))
По поводу модифицируемости HashMap, я не понял ((

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public class ColorCollection {

    public static final ColorCollection INSTANCE = new ColorCollection();

    private final HashMap<Integer, String> hashmap = new HashMap<>();

    private ColorCollection() {
        hashmap.put(0, "red");
        hashmap.put(1, "lightred");
        hashmap.put(2, "amaranthPink");
        hashmap.put(3, "brightOrangeYellow");
        hashmap.put(4, "lightorange");
        hashmap.put(5, "paleOrangeYellow");
        hashmap.put(6, "rapeseedYellow");
        hashmap.put(7, "yellow");
        hashmap.put(8, "brightYellow");
        hashmap.put(9, "lemonChiffon");
        hashmap.put(10, "green");
        hashmap.put(11, "irishGreen");
        hashmap.put(12, "paleGreen");
        hashmap.put(13, "brightGreen");
        hashmap.put(14, "blue");
        hashmap.put(15, "cyan");
        hashmap.put(16, "lightBlue");
        hashmap.put(17, "magenta");
        hashmap.put(18, "halfMagenta");
        hashmap.put(19, "paleMagenta");
        hashmap.put(20, "darkGray");
        hashmap.put(21, "gray");
        hashmap.put(22, "lightGray");
    }

    /**
     *
     * @param colorNum key in hashmap
     * @return 0 = red; 1 = lightred; 2 = amaranthPink; 3 = brightOrangeYellow;
     * 4 = lightorange; 5 = paleOrangeYellow; 6 = rapeseedYellow; 7 = yellow; 8
     * = brightYellow; 9 = lemonChiffon; 10 = green; 11 = irishGreen; 12 =
     * paleGreen; 13 = brightGreen; 14 = blue; 15 = cyan; 16 = lightBlue; 17 =
     * magenta; 18 = halfMagenta; 19 = paleMagenta; 20 = darkGray; 21 = gray; 22
     * = lightGray;
     */
    public String getColorName(int colorNum) {
        return hashmap.get(colorNum);
    }
}

...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312519
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а все понял, поставил статик
private static final HashMap<Integer, String> hashmap = new HashMap<>();
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312526
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вся эта чехарда с переводом цветов началась с того, что в JasperReport в шаблон jrxml, если быть точнее, нельзя передать цвет параметром, так, чтобы фон ячеек был абсолютно любого цвета.
Изначально я работал с RGB и с Hex, можно было выбирать любой цвет из палитры, он в системе красил фон текста, но в экселе даже в 10 или какой он там сейчас *.xlsx формат, даже в нем нет поддержки выделения фона текста аля html, только сам текст можно покрасить и фон всей ячейки.
Сколько я не рыл инет по поводу передачи цвета фона ячейки в джаспер через параметр, найти не смог. Пишут, что такое невозможно и предлагают использовать стили, вот по параметру стиль можно выбрать, у стиля в iReport можно выбрать фон ячейки, причем любой hex, а передать в стиль из кода нельзя. В общем попа с этими цветами, а надо чтобы и в системе и в отчетах цвета совпадали :)
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312584
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public enum ColorMap {
    reserved,
    lightred,
    amaranthPink,
    brightOrangeYellow,
    lightorange,
    paleOrangeYellow,
    rapeseedYellow,
    yellow,
    brightYellow,
    lemonChiffon,
    green,
    irishGreen,
    paleGreen,
    brightGreen,
    blue,
    cyan,
    lightBlue,
    magenta,
    halfMagenta,
    paleMagenta,
    darkGray,
    gray,
    lightGray;

    public static String getColorName(int num) {
        return ColorMap.values()[num];
    }
}



Некоторым претит использовать ordinal. Тогда можно добавить конструктор. Но я особого смысла не вижу.
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312586
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public enum ColorMap {
    lightred,
    ...
    lightGray;

    public static String getColorName(int num) {
        return ColorMap.values()[num - 1];
    }
}
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312715
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312738
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ой. name() же я забыл добавить чтобы в String привести.
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312750
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicAlexey Tominenum

PS: зачем цвета обозхначать номерами?
Просто мне удобно, нажать контрол+пробел, посмотреть хелп и выбрать номер, нежели писать "paleOrangeYellow" и т.д.

а почему бы цвет константой не задать?

Код: java
1.
2.
3.
public class Colors {
    public static final String paleOrangeYellow = "paleOrangeYellow";
}





IDE тебе автокоплитом поможет, и искать использования легче будет, и хелп читать не надо.
Код: java
1.
2.
3.
if (что-то там с данными) {
    return Colors.paleOrangeYellow;
}
...
Рейтинг: 0 / 0
Покритикуйте метод для внутренних нужд
    #39312868
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Все, проблему решил, пока что на бумаге/в голове :)
C enum не связывался никогда, теперь буду знать, если понадобится, буду использовать.
Наверное перепишу сейчас так, чтобы на самом деле методом вызывался цвет как pavel_nv подсказал. Потому что в джаспер все-равно hex просто так не передать, а переписывать отчет с использованием JRDesignTextField и JRDesignStyle вообще не хочется, да еще не факт, что сработает. Придется перейти к заданному изначально списку цветов и добавить в джаспер условия.
Оказалось, в джасперРепорте есть ConditionalStyle, добавляется к одному из стилей.
А в java коде уже, в зависимости от данных можно передать параметр, через тот же JRField, к примеру, который в отчете на листе не отображать.
Осталось:
Прописать варианты цветов в scss, потому что в Vaadin (а именно он используется) свои стили нужно добавлять через scss. На счет mixins, я с ним не знаком, так что пока не припрет совсем, лезть туда не буду :)
В отчет *.jrxml добавить все 23 стиля (в другие отчеты потом копировать).
В java коде прописать когда, какие цвета (строковый параметр, аля "red" и т.д.) отправлять в джаспер.
Написать отдельный класс с окном, в котором пользователь будет щелкать и выбирать цвет из предложенных, чтобы "покрасить", в частности (пока что) строку в таблице.
Попробовал цвета, передаются, красятся :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Покритикуйте метод для внутренних нужд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]