带有ImageIcon列的Java JTable TableCellRenderer
我有一个带有自定义表模型的表,它有两列。列0是ImageIcon类,列1是String类带有ImageIcon列的Java JTable TableCellRenderer,java,swing,jtable,Java,Swing,Jtable,我有一个带有自定义表模型的表,它有两列。列0是ImageIcon类,列1是String类 public Class<?> getColumnClass(int col) { if (col == 0) { return ImageIcon.class; } else { return String.class; } } 有没有办法解决这个问题 我的错误,有点隐蔽: 当我定义一个新的TableCellRenderer类添加到列中
public Class<?> getColumnClass(int col) {
if (col == 0) {
return ImageIcon.class;
} else {
return String.class;
}
}
有没有办法解决这个问题
我的错误,有点隐蔽:
当我定义一个新的TableCellRenderer类添加到列中以便设置单元格样式时,它会覆盖ImageIcon类并将其设置为字符串
public class CustomTableCellRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent (JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int
column)
{
Component cell = super.getTableCellRendererComponent(table,
obj, isSelected, hasFocus, row, column);
if(isSelected)
cell.setBackground(Color.BLUE);
return cell;
}
}
所以问题是,当我定义这个TableCellRenderer类来设置我的表的样式时,我的表中的ImageIcon列会变成“File:…”之类的字符串,而不是实际的图标。另一个可能的解决方案是自己设置图标。我不确定这是否是最好的解决方案,但它确实有效:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
column);
((JLabel)cell).setIcon((Icon)value);
((JLabel)cell).setText("");
((JLabel)cell).setHorizontalAlignment(JLabel.CENTER);
if (isSelected) {
cell.setBackground(Color.blue);
} else {
cell.setBackground(null);
}
return cell;
}
另一个可能的解决方案是自己设置图标。我不确定这是否是最好的解决方案,但它确实有效:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
column);
((JLabel)cell).setIcon((Icon)value);
((JLabel)cell).setText("");
((JLabel)cell).setHorizontalAlignment(JLabel.CENTER);
if (isSelected) {
cell.setBackground(Color.blue);
} else {
cell.setBackground(null);
}
return cell;
}
无需创建自定义渲染器。JTable allready支持包含图标的列的默认呈现器。您所需要做的就是重写getColumnClass()方法,您似乎正在这样做。无需创建自定义渲染器。JTable allready支持包含图标的列的默认呈现器。您所需要做的就是重写getColumnClass()方法,您似乎正在这样做。很抱歉,您似乎还没有问这个问题。你刚才解释了你在做什么。请解释一下这个问题。发生了什么?什么不起作用?您确定看到的是渲染器而不是编辑器吗?是显示所有单元格的数字,还是仅显示具有焦点且正在编辑的单元格的数字?如果是后者,您可能需要摆弄单元格编辑器。显示哪些数字?因为我的单元格在select上确实会变成蓝色,所以我很确定它是渲染器。是的,你说得对。在检查内容时,JTable在显示图像图标时不会使用DefaultCellRenderer,而是使用称为IconRenderer的东西。我还没有找到这个类,但正在查找。也许你想试试Darryl Burke的图标单元格渲染器?:很抱歉,你似乎还没有问这个问题。你刚才解释了你在做什么。请解释一下这个问题。发生了什么?什么不起作用?您确定看到的是渲染器而不是编辑器吗?是显示所有单元格的数字,还是仅显示具有焦点且正在编辑的单元格的数字?如果是后者,您可能需要摆弄单元格编辑器。显示哪些数字?因为我的单元格在select上确实会变成蓝色,所以我很确定它是渲染器。是的,你说得对。在检查内容时,JTable在显示图像图标时不会使用DefaultCellRenderer,而是使用称为IconRenderer的东西。我还没有找到这个类,但我正在寻找。也许你想试试Darryl Burke的图标单元格渲染器?:是的,我几分钟前才发现这种方法,不太优雅,但效果非常好。酷。您可能还需要将JLabel的文本设置为“”,将水平对齐设置为中心:是的,我几分钟前才发现这种方法,不太优雅,但效果非常好。酷。您可能还需要将JLabel的文本设置为“”,并将水平对齐设置为居中: