2012-04-15 107 views
0

在下图中,您将看到一个带有两列的JTable在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

+0

你尝试过'myTable.setShowVerticalLines(false);'?同时检查'JTable.setIntercellSpacing(Dimension intercellSpacing)'。 – Torious 2012-04-15 18:11:10

+0

setShowVerticalLines已被设置为false,但我忘记了setIntercellSpacing。 setIntercellSpacing(new Dimension(0,0)); ....没有任何区别。 – Erik 2012-04-15 19:04:53

+1

为更好的帮助,尽快编辑你的问题与[SSCCE](http://sscce.org/),图标,你可以简单地使用'UIManager.getIcon(“OptionPane.questionIcon”)' – mKorbel 2012-04-15 19:54:14

回答

3

也许你可以使用自定义渲染一个JList。然后,渲染器将采用spriid friend对象并使用带有GridLayout的简单JPanel构造适当的标签。

+0

可以JList有两列吗? – Erik 2012-04-15 23:19:42

+0

从技术上讲,不。但是你可以让它看起来像渲染器中的两列。 – 2012-04-15 23:41:49

+0

适用于JList。删除检查图像totaly和使用两个大图像,一个检查和一个没有。 – Erik 2012-04-16 02:27:48

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); 
    } 
}); 
+0

有趣的将测试一些..我在AbstractTableModel getColumnClass()返回ImageIcon.class – Erik 2012-04-15 23:20:13

+0

我可以返回getTableCellRendererComponent其他的东西,以及如何?该方法以this.setText(“”);结束。 ... – Erik 2012-04-15 23:28:46

+0

很容易认识到,单个组件可以重用于多个单元;因此每次再次设置作为文本和颜色的属性。你应该这样做,但组件是无关紧要的。对于我的答案中的代码,我会给出一个替代方案。 – 2012-04-16 08:48:20