2011-10-12 96 views
1

在我的应用程序中,我正在读取.xml文件并将数据写入JTable中。除了表格的数据之外,.xml文件还包含一个定义每行背景颜色的属性。我对细胞渲染的方法看起来是这样的:在Java中投射错误

 

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文件在程序中被初始化。我的问题是,我不知道如何定义文件中的颜色,以便变量测试可以将其保存为一种颜色。我试着把它写成“Color.white”,“white”,甚至是“255,255,255”,但是当我试着将它保存在变量中时,我得到了一个转换错误。

任何想法如何定义文件中的颜色?

+0

我想你想投行对象为Color对象.. – Rob

+0

没有...我将正确的对象......这是我在列,并从中获得唯一的颜色属性...然后我尝试投它..这不工作 – schmimona

+0

如果测试是一个字符串,我会写测试= go.getValueByName(“COLOR”)。toString();它会工作...但是我不能从一个字符串设置组件的背景,我可以吗? – schmimona

回答

1

我认为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

作为对42个答案的追踪,它确实取决于应该如何将颜色存储在XML中。也可以将颜色值保存为单个字符串(无逗号),表示颜色的十进制或十六进制值。 (十六进制对于颜色更易于人类阅读,例如对于黄色而言“FFFF00”而不是“16776960”)

例如,为十进制(和没有错误检查,根据记录,我喜欢的默认值等中使用的42)

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

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

例如十六进制(你需要avoidOverflows处理与alpha值的颜色像F)

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规范。