0

在下图中,您可以看到一个JTable有两列的 a。

更新
**这些列是隐藏的。所选行后面的红色为
背景色红色,仅用于演示目的
。**

每行有两张图片。

第一张图片是一个看起来像复选框的 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

4

2 回答 2

3

The default cell renderer extends JLabel, and uses itself as component to display the cell. A JLabel has icon and text with a gap in between. Maybe that is the cause:

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;
    }

});

Alternatively:

table.setDefaultRenderer(ImageIcon.class, new DefaultTableCellRenderer() {
    {
        setIconTextGap(0);
    }
});
于 2012-04-15T22:19:27.240 回答
3

Maybe you can just use a JList with custom renderer. The renderer would then take the spriid friend objects and construct appropriate labels using a simple JPanel with GridLayout.

于 2012-04-15T22:53:19.660 回答