在下图中,您会看到一个包含两列的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;
}
答案 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对象并构造适当的标签。