不完全确定“关闭一个像素”是什么意思 - 但要在没有任何视觉伪像的情况下实现零单元格间距,您必须将边距归零并关闭网格线:
table.setIntercellSpacing(new Dimension(0, 0));
table.setShowGrid(false)
Edit
好吧,仔细看看,你的代码有几个问题
- 您间接而不是直接调整列大小(还有另一个很好的例子,为什么永远不要执行 component.setPreferredSize :-)
- 渲染器的边框需要一定的大小
要修复第一个,请配置每个column的宽度,表格布局会自动配置它自己
final int rows = 16;
final int columns = 16;
Tile tile = new Tile(0);
int tileHeight = tile.getIcon().getIconHeight();
int tileWidth = tile.getIcon().getIconWidth();
JTable table = new JTable(rows, columns);
// remove all margin
table.setIntercellSpacing(new Dimension(0, 0));
table.setShowGrid(false);
table.setTableHeader(null);
// set the rowHeight
table.setRowHeight(tileHeight);
// turn off auto-resize
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// configure each column with renderer and prefWidth
for (int j = 0; j < columns; j++) {
TableColumn column = table.getColumnModel().getColumn(j);
column.setCellRenderer(new MyRenderer());
column.setPreferredWidth(tileWidth);
}
对于第二个,将每次调用中的边框清空:
public static class MyRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
setBorder(null);
Tile tile = (Tile) value;
setIcon(tile.getIcon());
return this;
}
}