Не совсем уверен, что вы подразумеваете под «одним пикселем» - но для достижения нулевого интервала между ячейками без каких-либо визуальных артефактов вы должны обнулить поля и отключить линии сетки:
table.setIntercellSpacing(new Dimension(0, 0));
table.setShowGrid(false)
Редактировать
Хорошо, если присмотреться, есть несколько проблем с вашим кодом
- вы делаете размер столбца косвенно, а не напрямую (и еще один хороший пример, почему никогда не делать компонент.setPreferredSize: -)
- граница рендерера имеет некоторый размер
чтобы исправить первое, настройте ширину каждого столбца , макет таблицы автоматически настроит сам
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;
}
}