在JTable中删除图像之间的空间

时间:2012-04-15 17:42:06

标签: java swing jtable graphics2d tablecellrenderer

在下图中,您会看到一个包含两列的JTable

UPDATE
**列是隐藏的。所选行后面的红色为
背景颜色红色仅用于演示目的
。 **

每行有两张图片。

第一张照片是一张看起来像复选框的png图片。其次是 写入朋友姓名的png图像。

图像应该看起来像一个图像,但是有一个空间。

是否可以删除此空间?
图像没有空间

使用JTable可能无法做到这一点 在那种情况下,其他摆动“列表”可以做到这一点。

创建表的代码

        jTableSpriidFriends = new JTable();
        jTableSpriidFriends.setRowMargin(0);
        jTableSpriidFriends.setIntercellSpacing(new Dimension(0, 0));
        jTableSpriidFriends.setShowHorizontalLines(false);
        jTableSpriidFriends.setShowVerticalLines(false);
        jTableSpriidFriends.setShowGrid(false);
        m_adapterSpriidFriends = new AbstractTableModelJTableSpriidFriends();
        rendererSpriidFriends = new CellRendererJtableSpriidFriends();
        jTableSpriidFriends.setModel(m_adapterSpriidFriends);
        jTableSpriidFriends.setDefaultRenderer(ImageIcon.class,
rendererSpriidFriends );
        jTableSpriidFriends.setRowSelectionAllowed(true);
        jTableSpriidFriends.addMouseListener(this);
        jTableSpriidFriends.getSelectionModel().addListSelectionListener(this);
        jTableSpriidFriends.setTableHeader(null);

        scrollPaneSpriidFriends = new JScrollPane();
        scrollPaneSpriidFriends.setBounds(11, 55, 176, 264);
        panelSpriid.add(scrollPaneSpriidFriends);
        scrollPaneSpriidFriends.setViewportView(jTableSpriidFriends);

    for (int i=0; i<m_adapterSpriidFriends.getColumnCount(); i++) {
        TableColumn column = jTableSpriidFriends.getColumnModel().getColumn(i);
        if (i==0) column.setPreferredWidth(50);
        if (i==1) column.setPreferredWidth(120);

    }

这里是DefaultTableCellRenderer

case 0:// type

    if(friend.selected){
       image = new ImageIcon(getClass().getResource
       ("/resources/friendlist/checkbox_checked.png")).getImage();
       this.setIcon( new ImageIcon(image));
    }else{
       image = new ImageIcon(getClass().getResource("/resources
       /friendlist/checkbox_unchecked.png")).getImage();
       this.setIcon( new ImageIcon(image));
    }

    break;
case 1:// files

    BufferedImage old = null;
    try {

         if(friend.deviceType.equals(Consts.DEVICE_TYPE_DEVICE))
        old = ImageIO.read(getClass().getResource
        ("/resources/friendlist/row_with_device.png"));
          else
        old = ImageIO.read(getClass().getResource
        ("/resources/friendlist/row_with_pc.png"));

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

      int w = old.getWidth();
      int h = old.getHeight();
      BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

      Graphics2D g2d = img.createGraphics();
      g2d.drawImage(old, 0, 0, null);
      g2d.setPaint(Color.WHITE);
      //g2d.setFont(new Font("Serif", Font.BOLD, 20));

      String s = friend.name;
      FontMetrics fm = g2d.getFontMetrics();
      int x = 10 ;
      int y = 20;
      g2d.drawString(s, x, y);
      g2d.dispose();


    this.setIcon( new ImageIcon(img));
    break;              
}

enter image description here

2 个答案:

答案 0 :(得分:3)

默认的单元格渲染器扩展JLabel,并将自身用作组件来显示单元格。 JLabel的图标和文字之间有间隙。也许这就是原因:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel)comp;
            label.setIconTextGap(0);
        }
        return comp;
    }

});

可替换地:

table.setDefaultRenderer(ImageIcon.class, new DefaultTableCellRenderer() {
    {
        setIconTextGap(0);
    }
});

答案 1 :(得分:3)

也许您可以将JList与自定义渲染器一起使用。然后,渲染器将使用一个简单的JPanel和GridLayout来获取spriid friend对象并构造适当的标签。