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

时间:2012-02-10 05:44:07

标签: java swing icons jtable rendering

使用以下代码在JTable单元格中显示图像。我有两个问题需要在jtable单元格中添加图像。

1.如果我点击表格中的第一行," Pointer.gif"图像将显示在该行中。当我点击第二行时,"指针.gif"图像将显示在第二行,第一行得到" Blank.Gif"然后我点击第三行,Pointer.gif将显示在第三行,第二行得到"空白.gif要点"从第一行开始。在这个时候第一行将变为空(这意味着第一行没有得到pointer.gif和blank.gif)。如何做到这一点?

2.第二个问题是,如果我选择第一行,pointer.gif将显示第一行。当我点击第二行时,pointer.gif将移动第二行,第一行得到empty.how要做此?

我的问题是,当我使用以下代码时," 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());

3 个答案:

答案 0 :(得分:2)

渲染器中的

getTableCellRendererComponent将返回带有图标的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;
         }
    }

答案 1 :(得分:2)

我认为不鼓励每次渲染单元格时加载图片并消耗大量RAM。外包该代码。 如果你把你的imags包装在.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());

答案 2 :(得分:2)

渲染器返回

JTable table, Object value, boolean selected, boolean focus, int row, int col

这些值中的每一个都是可测试的,其中大部分都是可设置的(需要熟悉Java ...)意味着你可以测试

  • Object instanceOf Whatever

  • selected

  • focus

  • JTable's row & col

真的要看prepareRenderer