Ошибка приведения в Java

#java #swing #casting #colors

#java #swing #Кастинг #Цвет

Вопрос:

В моем приложении я читаю XML-файл и записываю данные в JTable. Помимо данных для таблицы, XML-файл содержит атрибут, определяющий цвет фона каждой строки. Мой метод рендеринга ячеек выглядит примерно так:

общедоступный компонент getTableCellRendererComponent(таблица JTable, значение объекта, логическое значение выбрано,
логическое значение имеет фокус, int row, int col) {
 JComponent comp = новый JLabel();

 если (null != значение) {
 // чтение данных и запись их в комп
 }

 GenericTableModel model = (GenericTableModel) таблица.getModel();
 GenericObject go = model.getRowObject(строка);

 Тест цвета = новый цвет (255, 255, 255);
 если (go.getValueByName("COLOR") == null){

 }else{
test =(Color) go.getValueByName("ЦВЕТ");
 }

 comp.setBackground(тест);

 возвращает comp;
}

Файл .xml инициализируется в программе. Моя проблема в том, что я не знаю, как определить цвет в файле, чтобы переменная test могла сохранить его как цвет. Я попытался записать это как «Цвет.белый «, «белый» и даже «255, 255, 255», но я получаю ошибку приведения, когда пытаюсь сохранить ее в переменной.

Есть идеи относительно того, как я мог бы определить цвет в файле?

Комментарии:

1. Я думаю, вы пытаетесь преобразовать объект Row в объект Color..

2. нет … я добавляю правильный объект… я беру строку и получаю из нее только атрибут color … а затем я пытаюсь ее применить .. что не работает

3. если бы test был строкой, и я бы написал test = go.getValueByName(«COLOR»).toString(); это сработало бы … но тогда я не могу установить фон компонента из строки, не так ли?

Ответ №1:

Я так понимаю, что GenericObject#getValueByName() возвращает строку, верно? В этом случае вам нужно преобразовать строку во что-то, что можно использовать для создания экземпляра Color. Предполагая, что строка равна «R, G, B», затем разделите строку на запятую, преобразуйте каждый компонент в целое число и создайте цвет:

 public static Color fromString(String rgb, Color deflt) {
    String[] comp = rgb.split(",");
    if (comp.length != 3)
        return def<
    int rc[] = new int[3];
    for (int i = 0; i < 3;   i) {
        rc[i] = Integer.parseInt(comp[i].trim());
        if (rc[i] < 0 || rc[i] > 255)
            return def<
    }
    Color c = new Color(rc[0], rc[1], rc[2]);
    return c;
}
  

Другой альтернативой является определение поля цвета с именами цветов, соответствующими предопределенным статическим полям в цвете (Color.ЧЕРНЫЙ, цветной.КРАСНЫЙ и т. Д.), И используйте отражение, чтобы получить правильное поле, но я оставляю это как упражнение.

Ответ №2:

В качестве продолжения ответа forty-two, это действительно зависит от того, как цвет должен храниться в XML. Также можно было бы сохранить значение цвета в виде одной строки (без запятых), представляющей либо десятичное, либо шестнадцатеричное значение цвета. (Шестнадцатеричный код более удобочитаем для цветов, например, «FFFF00» для желтого вместо «16776960»)

например, как десятичное число (и без проверки ошибок, для записи, мне нравятся значения по умолчанию, например, сорок два)

 public static Color readColor(String decimalString) {
   return new Color(Integer.parseInt(decimalString));
}

public String writeColor(Color color) {
    return Integer.toString(color.getRGB());
}
  

например, как hex (вам нужно избегать переполнения для обработки цветов с альфа-значениями, такими как F0123456)

 public static Color readColor(String hexString) {
    long avoidOverflows = Long.parseLong(hexString, 16);
    return new Color((int)long);
}

public String writeColor(Color color) {
    return Integer.toHexString(color.getRGB(), 16);
}
  

Я даже видел шестнадцатеричные значения, которым предшествует «#», чтобы сделать их более похожими на HTML. Итак, это действительно зависит от спецификации вашего XML.