Java 如何使用渲染器在Jtable单元格中设置图像?

Java 如何使用渲染器在Jtable单元格中设置图像?,java,swing,icons,jtable,rendering,Java,Swing,Icons,Jtable,Rendering,我使用下面的代码在JTable单元格中显示图像。我有两个关于在JTable单元格中添加图像的问题 1.如果我单击表中的第一行,则“Pointer.gif”图像将显示在该行中。当我单击第二行时,“Pointer.gif”图像将显示在第二行中,第一行将显示“Blank.gif”。然后我单击第三行,Pointer.gif将显示在第三行中,第二行将显示“Blank.gif”从第一行开始。此时第一行将变为空(这意味着第一行没有得到pointer.gif和blank.gif)。如何执行此操作 2.第二个问题

我使用下面的代码在JTable单元格中显示图像。我有两个关于在JTable单元格中添加图像的问题

1.如果我单击表中的第一行,则“Pointer.gif”图像将显示在该行中。当我单击第二行时,“Pointer.gif”图像将显示在第二行中,第一行将显示“Blank.gif”。然后我单击第三行,Pointer.gif将显示在第三行中,第二行将显示“Blank.gif”从第一行开始。此时第一行将变为空(这意味着第一行没有得到pointer.gif和blank.gif)。如何执行此操作

2.第二个问题是,如果我选择第一行,pointer.gif将显示在第一行中。当我单击第二行时,pointer.gif将移动第二行,第一行变为空。如何操作

我的问题是,当我使用以下代码时,“blank.gif”将显示在整个列中。当我单击特定行时,“pointer.gif”将显示在该位置

    class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
           ImageIcon Icon;
       public Component getTableCellRendererComponent(
          JTable table, Object value, boolean selected, boolean focus,
          int row, int col) {
           if(selected == true){
               Icon=new ImageIcon(getClass().getResource("pointer.gif"));
           }
      else{
          Icon=new ImageIcon(getClass().getResource("blank.jpg"));
       }
           this.setIcon(Icon);
           return this;
         }

    }
    call this class like,

    table1.getColumnModel().getColumn(0).setCellRenderer(new FRM_FLXD_ICON_ASSGN());

在渲染器中,GetTableCellRenderComponent将返回带有图标的jLabel

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
           JLabel jLabel;
       public Component getTableCellRendererComponent(
          JTable table, Object value, boolean selected, boolean focus, int row, int col) {
           jLabel = new JLabel();
           if(selected == true){
               jLabel.setIcon(new ImageIcon(ImageIO.read(new File("C://pointer.jpg"))));
           }
      else{
          jLabel.setIcon(new ImageIcon(ImageIO.read(new File("C://blank.jpg"))));
       }
           return jLabel;
         }
    }

我认为每次渲染单元格时加载图片是不可取的,并且会消耗大量内存。把代码外包出去。 如果将IMAG打包到.jar中,则getResource()是正确的

我会这样想

ImageIcon pointer = new ImageIcon(getClass.getResource("pointer.jpg")));
ImageIcon blank = new ImageIcon(getClass.getResource("blank.jpg")));

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
       JLabel jLabel;
   public Component getTableCellRendererComponent(
      JTable table, Object value, boolean selected, boolean focus, int row, int col) {
       if(selected == true){
           jLabel.setIcon(pointer);
       }
  else{
      jLabel.setIcon();
   }
       return jLabel;
     }
}
编辑:

也许应该是这样的

ImageIcon pointer = new ImageIcon(getClass.getResource("pointer.jpg")));
ImageIcon blank = new ImageIcon(getClass.getResource("blank.jpg")));

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
       JLabel jLabel;
   public Component getTableCellRendererComponent(
      JTable table, Object value, boolean selected, boolean focus, int row, int col) {
       if(table.isColumnSelected(column)){
           jLabel.setIcon(pointer);
       }else{
           jLabel.setIcon(blank);
       }
       return jLabel;
     }
}
在您的表中,您应该将它附加到只想显示指针的列上

table.getColumnModel().getColumn(1).setCellRenderer(new YourRenderer());
渲染器返回

JTable table, Object value, boolean selected, boolean focus, int row, int col
这些值中的每一个都是可测试的,其中大多数是可设置的(需要良好的Java知识…),这意味着您可以进行测试

  • 任何对象的对象实例

  • 已选择

  • focus

  • JTable的行和列


真的是时候看看了

要想更快地获得更好的帮助,请发布一篇文章。对于涉及图像的SSCCE,热链接到它们,从JRE获取它们或在代码中生成它们。如果我这样使用,我会得到以下错误javax.imageio.IIOException:无法读取输入文件!因为您没有这样的文件。您必须指定文件的路径。jLabel.setIcon()可以在整列中设置空图标。当我单击指针时,将显示对不起。这意味着jLabel.setIcon(空白);