Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的强制转换错误_Java_Swing_Casting_Colors - Fatal编程技术网

Java中的强制转换错误

Java中的强制转换错误,java,swing,casting,colors,Java,Swing,Casting,Colors,在我的应用程序中,我正在读取一个.xml文件并将数据写入JTable。除了表的数据外,.xml文件还包含一个定义每行背景颜色的属性。我的单元渲染方法如下所示: public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { JComponent comp = new JLa

在我的应用程序中,我正在读取一个.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; } 公共组件GetTableCellRenderComponent(JTable表、对象值、布尔值、, 布尔值(焦点、整数行、整数列){ JComponent comp=新的JLabel(); if(null!=值){ //读取数据并将其写入comp } GenericTableModel=(GenericTableModel)table.getModel(); GenericObject go=model.getRowObject(行); 颜色测试=新颜色(255、255、255); if(go.getValueByName(“COLOR”)==null){ }否则{ test=(Color)go.getValueByName(“Color”); } 公司背景(试验); 返回补偿; } .xml文件在程序中初始化。我的问题是,我不知道如何在文件中定义颜色,以便变量测试能够将其保存为颜色。我尝试将它写为“Color.white”、“white”甚至“255、255、255”,但在尝试将其保存到变量中时,出现了一个强制转换错误


关于如何定义文件中的颜色有什么想法吗?

我认为GenericObject#getValueByName()返回一个字符串,对吗?在这种情况下,需要将字符串转换为可用于创建颜色实例的内容。假设字符串为“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;
}
公共静态颜色fromString(字符串rgb,颜色定义){
字符串[]comp=rgb.split(“,”);
如果(组件长度!=3)
回撤;
int rc[]=新的int[3];
对于(int i=0;i<3;++i){
rc[i]=Integer.parseInt(comp[i].trim());
if(rc[i]<0 | | rc[i]>255)
回撤;
}
颜色c=新颜色(rc[0],rc[1],rc[2]);
返回c;
}

另一种方法是使用颜色名称来定义颜色字段,颜色名称与颜色中预定义的静态字段(color.BLACK、color.RED等)相匹配,并使用反射来获取正确的字段,但我将此作为练习。

我认为GenericObject#getValueByName()返回字符串,对吗?在这种情况下,需要将字符串转换为可用于创建颜色实例的内容。假设字符串为“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;
}
公共静态颜色fromString(字符串rgb,颜色定义){
字符串[]comp=rgb.split(“,”);
如果(组件长度!=3)
回撤;
int rc[]=新的int[3];
对于(int i=0;i<3;++i){
rc[i]=Integer.parseInt(comp[i].trim());
if(rc[i]<0 | | rc[i]>255)
回撤;
}
颜色c=新颜色(rc[0],rc[1],rc[2]);
返回c;
}

另一种方法是使用颜色名称来定义颜色字段,颜色名称与颜色中预定义的静态字段(color.BLACK、color.RED等)相匹配,并使用反射来获得正确的字段,但我将此作为练习。

作为四十二个答案的后续内容,这实际上取决于颜色在XML中的存储方式。也可以将颜色值保存为单个字符串(无逗号),表示颜色的十进制或十六进制值。(对于颜色,十六进制更易于人类阅读,例如黄色的“FFFF00”而不是“16776960”)

e、 g.作为十进制(并且没有错误检查,对于记录,我喜欢使用42这样的默认值)

e、 g.作为十六进制(您需要avoidOverflows来处理像F0123456这样的alpha值的颜色)


我甚至看到了前面带有“#”的十六进制值,使它们更像HTML。因此,这实际上取决于XML的规范。

作为42的后续答案,这实际上取决于颜色在XML中的存储方式。也可以将颜色值保存为单个字符串(无逗号),表示颜色的十进制或十六进制值。(对于颜色,十六进制更易于人类阅读,例如黄色的“FFFF00”而不是“16776960”)

e、 g.作为十进制(并且没有错误检查,对于记录,我喜欢使用42这样的默认值)

e、 g.作为十六进制(您需要avoidOverflows来处理像F0123456这样的alpha值的颜色)


我甚至看到了前面带有“#”的十六进制值,使它们更像HTML。因此,这实际上取决于XML的规范。

我认为您正在尝试将行对象强制转换为颜色对象。不…我正在添加正确的对象…我正在获取行并从中仅获取颜色属性…然后我尝试强制转换它。如果test是字符串,我将编写test=go.getValueByName(“颜色”).toString();它本来可以工作…但是我不能从字符串设置组件的背景,我可以吗?我想你是在尝试将一个行对象强制转换为一个颜色对象..不…我正在添加正确的对象..我正在获取该行并从中仅获取颜色属性…然后我尝试强制转换它..这不起作用如果测试是字符串,我会编写test=go.getValueByName(“颜色”).toString();它本来可以工作…但是我不能从字符串设置组件的背景,可以吗?
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);
}