Swing JTable单元格中的图像是否减少一个像素?
因此,我现在可以将图像加载到我的JTable的单元格中,但由于某种原因,图形都向右移动了一个像素,这样我就可以看到JTable的背景。有什么想法吗?抱歉,如果我的格式设置关闭;仍然不完全习惯这种标记Swing JTable单元格中的图像是否减少一个像素?,swing,jtable,jscrollpane,imageicon,Swing,Jtable,Jscrollpane,Imageicon,因此,我现在可以将图像加载到我的JTable的单元格中,但由于某种原因,图形都向右移动了一个像素,这样我就可以看到JTable的背景。有什么想法吗?抱歉,如果我的格式设置关闭;仍然不完全习惯这种标记 public static void main(String[] args) { final int rows = 16; final int columns = 16; final int dimTile = 32; JFrame frame = new JFram
public static void main(String[] args) {
final int rows = 16;
final int columns = 16;
final int dimTile = 32;
JFrame frame = new JFrame("test");
JTable table = new JTable(rows, columns);
table.setIntercellSpacing(new Dimension(0, 0));
table.setShowGrid(false);
table.setBackground(Color.cyan);
table.setTableHeader(null);
table.setRowHeight(dimTile);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setPreferredSize(new Dimension(rows * dimTile, columns * dimTile));
Tile tile = new Tile(0);
for(int i = 0; i < rows; i++) {
for(int j = 0; j < columns; j++) {
table.getColumnModel().getColumn(j).setCellRenderer(new MyRenderer());
table.setValueAy(tile, i, j);
}
}
JScrollPane scrollPane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
frame.getContentPane().add(scrollPane);
frame.setSize(512, 512);
frame.setVisible(true);
int adjustedSizeX = frame.getInsets().left + frame.getInsets().right + 512;
int adjustedSizeY = frame.getInsets().top + frame.getInsets().bottom + 512;
frame.setSize(adjustedSizeX, adjustedSizeY);
frame.pack();
...
}
public 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);
Tile tile = (Tile) value;
setIcon(tile.getIcon());
return this;
}
}
public class Tile {
ImageIcon icon;
public Tile(int graphic) {
icon = new ImageIcon(PATH/TO/"...test.png");
}
public ImageIcon getIcon() {
return icon;
}
}
publicstaticvoidmain(字符串[]args){
最终整数行=16;
最终整数列=16;
最终整数dimTile=32;
JFrame=新JFrame(“测试”);
JTable table=新的JTable(行、列);
表.设置单元间距(新尺寸(0,0));
表1.setShowGrid(假);
表.立根背景(颜色为青色);
table.setTableHeader(空);
表.设置行高(dimTile);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
表.setPreferredSize(新维度(行*dimTile,列*dimTile));
瓷砖=新瓷砖(0);
对于(int i=0;i
不完全确定“关闭一个像素”是什么意思-但在没有任何视觉伪影的情况下实现零单元间距您必须将边距调零并关闭网格线:
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);
}
无法通过您发布的代码重现问题。发布一些代码,这些代码可以在没有任何依赖性的情况下重现您的问题。这段代码与我的项目完全一样,没有任何其他内容,就产生了问题。我创建了一个新项目,只使用这段代码(并将主方法粘贴到测试类中)来尝试它。图像之间存在一个可见的单像素间隙,因为每个单元中的图像已向右移动一个像素(切断图像最右边的像素)。将桌子的背景颜色更改为您认为最突出的颜色。我用的是青色,但不管怎样都行。对不起,不知怎的错过了表格。当我复印过来时,设置了ShowGrid(false)行。编辑以包含它。太棒了,谢谢!这正是我所需要的。另外,感谢您对setPreferredSize()的介绍;以前从来没有人告诉过我这件事,但快速浏览一下,我就明白了为什么这是个坏主意。
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;
}
}