2015-06-11 32 views
0

我在添加一个ImageIcon到我的JTable中的JLabel时遇到了问题。到目前为止,我完全可以根据单元格中数据的值来操作单元格,但每当我尝试添加图像时,我都只能看到文本。JTableCell中的ImageIcon

表格绘制

class DeviceTableModel extends AbstractTableModel { 
    private Object[][] data = Globals.getArray(); 
    private String[] columnNames = {"Name","Status","Description"}; 


    @Override 
    public int getRowCount() { 
     return data.length; 
    } 

    @Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return data[rowIndex][columnIndex]; 
    } 

    @Override 
    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    @Override 
    public Class getColumnClass(int c) { 
     return getValueAt(0,c).getClass(); 
    } 

    @Override 
    public void setValueAt(Object value, int row, int col) { 
     data[row][col] = value; 
     fireTableCellUpdated(row,col); 
    } 

} 

这是我用我的JTable中渲染。

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
    JLabel comp = (JLabel)super.prepareRenderer(renderer, row, col); 
    Object value = getModel().getValueAt(row, col); 

    if (value.equals("online")) { 
     comp.setIcon(new ImageIcon("/Res/online.png")); 
     comp.setBackground(Color.green); 
    }else { 
     comp.setBackground(Color.white); 
    } 

    return comp; 
} 

颜色和文字设置得很好,但图标将不会显示。任何想法,将不胜感激!通过VGR和Camickr

编辑 - 建议你的建议是当场上解决了这个问题!看看重做的部分。我很感激。多谢你们!

//preloaded just added here to show. 
ImageIcon icon = new ImageIcon(getClass().getResource("/Res/onlineIcon.png")); 


@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
    JLabel comp = (JLabel)super.prepareRenderer(renderer, row, col); 
    Object value = getModel().getValueAt(row, col); 

    if (value.equals("online")) { 
     comp.setIcon(icon); 
     comp.setBackground(new Color(173,255,92)); 
    }else { 
     comp.setIcon(null); 
     comp.setBackground(Color.white); 
    } 
    return comp; 
} 
} 
+2

[ImageIcon构造函数文档](http://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html#ImageIcon-java.lang.String-)明确指出字符串参数是一个文件名。除非你的系统在文件系统的根目录下有一个'Res'目录,否则你可能打算做新的ImageIcon(getClass()。getResource(“/ Res/online.jpg”))或'new ImageIcon(getClass ).getResource( “/ online.jpg”))'。请注意,您的'else'子句应该将图标设置为空,因为单个渲染器可能用于多个表格单元格。 – VGR

+2

1)代码是否正在执行?添加一个println(...)语句来验证。 2)图像是否被读取?此外,不断在prepareRenderer()方法中读取图像并不是一个好主意。渲染代码应该很快。图像应该被预加载。 – camickr

+0

哦,你们真是太棒了。 @VGR你是正确的我如何调用资源! camickr我接受了你的建议,并预装了图像,现在速度要快得多。你们好棒。 VGR请添加您的答案作为一个真正的答案,所以我可以接受它! – basic

回答

1

ImageIcon constructor documentation清楚地表明,该字符串参数是一个文件名。除非您的系统在文件系统的根目录中有一个Res目录,否则您可能打算执行new ImageIcon(getClass().getResource("/Res/online.jpg"))new ImageIcon(getClass().getResource("/online.jpg"))

请注意,您的else子句应该将图标设置为空,因为单个渲染器可能用于多个表格单元格。