2011-08-16 38 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