Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/408.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
带有ImageIcon列的Java JTable TableCellRenderer_Java_Swing_Jtable - Fatal编程技术网

带有ImageIcon列的Java JTable TableCellRenderer

带有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类添加到列中

我有一个带有自定义表模型的表,它有两列。列0是ImageIcon类,列1是String类

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的文本设置为“”,并将水平对齐设置为居中: