2011-08-16 35 views
2

所以,我现在可以将图像加载到我的JTable的单元格中,但由于某种原因,图形都向右移动了一个像素,这让我看到了JTable的背景。有任何想法吗?对不起,如果我的格式化关闭;仍然不完全习惯于这种标记。JTable单元格中的图像关闭一个像素?

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

无法通过您发布的代码重现问题。发布一些代码,可以重现您的问题,而无需任何依赖。 –

+0

这段代码与我的项目完全一样,没有任何其他内容,会产生问题。我只使用这段代码创建了一个新项目(并且在Test类中粘贴了主要方法)来试用它。在图像之间存在可见的一个像素间隙,因为每个单元中的图像已经向右移动一个像素(切断图像的最右侧像素)。在您看来,将表格的背景颜色更改为最好的。我去了青色,但无论什么作品。 – bendicott

回答

2

不完全知道你所说的“一个像素关”的意思 - 但实现了零的小区间的间距,而不用您既任何视觉假象零边距和关闭网格线:

table.setIntercellSpacing(new Dimension(0, 0)); 
table.setShowGrid(false) 

编辑

好了,仔细一看,还有你的代码的几个问题

  • 你做的列宽间接而不是直接(和另一个很好的例子,为什么到永远,永远做一个component.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; 
    } 
} 
+0

对不起,我错过了table.setShowGrid(false) 行。编辑包括它。 – bendicott

+1

真棒,谢谢!这正是我所需要的。另外,感谢关​​于setPreferredSize();之前没有人告诉我这个,但快速浏览一下[jGuru](http://www.jguru.com/faq/view.jsp?EID=237070)给了我一个不错的想法的理由。 – bendicott