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;
}
}
[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
1)代码是否正在执行?添加一个println(...)语句来验证。 2)图像是否被读取?此外,不断在prepareRenderer()方法中读取图像并不是一个好主意。渲染代码应该很快。图像应该被预加载。 – camickr
哦,你们真是太棒了。 @VGR你是正确的我如何调用资源! camickr我接受了你的建议,并预装了图像,现在速度要快得多。你们好棒。 VGR请添加您的答案作为一个真正的答案,所以我可以接受它! – basic