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

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

1 голос
/ 12 октября 2011

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


public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int col) {
    JComponent comp = new JLabel();

    if (null != value) {
        //reading the data and writing it in the comp
    }

    GenericTableModel model = (GenericTableModel) table.getModel();
    GenericObject go = model.getRowObject(row);

    Color test = new Color(255, 255, 255);
    if (go.getValueByName("COLOR") == null){

    }else{
        test =(Color) go.getValueByName("COLOR");
    }

    comp.setBackground(test);

    return comp;
}

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

Любые идеи относительно того, как можноОпределить цвет в файле?

Ответы [ 2 ]

1 голос
/ 12 октября 2011

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

public static Color fromString(String rgb, Color deflt) {
    String[] comp = rgb.split(",");
    if (comp.length != 3)
        return deflt;
    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 deflt;
    }
    Color c = new Color(rc[0], rc[1], rc[2]);
    return c;
}

Другой альтернативой является определение поля цветас именами цветов, совпадающими с предопределенными статическими полями в Color (Color.BLACK, Color.RED и т. д.), и используйте отражение, чтобы получить правильное поле, но я оставлю это в качестве упражнения.

0 голосов
/ 12 октября 2011

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

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

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

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

например, как шестнадцатеричный (вам нужно избегать переворачивания для обработки цветов с альфа-значениями, такими как 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.

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