【问题标题】:how to set the image in Jtable cell using renderer?如何使用渲染器在 Jtable 单元格中设置图像?
【发布时间】:2012-02-10 05:44:07
【问题描述】:

我使用以下代码在 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());

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。对于涉及图像的 SSCCE,热链接到它们,从 JRE 获取它们或在代码中生成它们。

标签: java swing icons jtable rendering


【解决方案1】:

在您的渲染器中,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;
         }
    }

【讨论】:

  • 如果我这样使用,我得到以下错误 javax.imageio.IIOException: Can't read input file!
  • 因为你没有这样的文件。您必须指定文件的路径。
【解决方案2】:

渲染器返回

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

这些值中的每一个都是可测试的,其中大多数是可设置的(需要良好的 Java 知识...),这意味着您可以测试

  • Object instanceOf Whatever

  • selected

  • focus

  • JTable's row & col

是时候看看prepareRenderer

【讨论】:

    【解决方案3】:

    我认为不鼓励每次渲染单元格时加载图片,并且会消耗大量 RAM。外包该代码。 如果您将图像打包在 .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());
    

    【讨论】:

    • jLabel.setIcon() 可以在整个列中设置空图标。当我单击指针时会显示
    • 对不起。这应该意味着 jLabel.setIcon(blank);
    猜你喜欢
    • 2014-06-26
    • 2011-10-02
    • 2020-01-20
    • 1970-01-01
    • 2012-08-05
    • 2018-04-19
    • 2013-02-10
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多