2011-08-16 9 views
2

これで、JTableのセルに画像を読み込むことができますが、何らかの理由で画像がすべて1ピクセル右に移動して、JTableの背景を見ることができます。何か案は?申し訳ありませんが私の書式がオフの場合;まだこのマークアップには完全には使用されていません。JTableセル内のイメージは1ピクセルだけオフになっていますか?

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

: - あなたは「一個の画素オフ」によって何を意味するか

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

このコードは、私のプロジェクトのものとまったく同じもので、問題が生じます。私はこのコードだけを使用して新しいプロジェクトを作成しました(テストクラスのmainメソッドを使って試してみました)。各セル内の画像が1ピクセル右にシフトされている(画像の右端のピクセルを切り取っている)ので、画像間に可視の1ピクセルのギャップがある。あなたの意見では、表の背景色を最も優れたものに変更してください。私はシアンと一緒に行きましたが、何があっても。 – bendicott

答えて

2

全くわからないが、あなたは両方を持っている任意の視覚的な人工物なしゼロセル間の間隔を達成グリッド線をマージンをゼロとオフ編集

近い見て、さて、あなたのコードにはいくつかの問題がある

  • あなたは列が間接的にサイズの代わりに、直接(さらに別の良い例です決して、今までやって、なぜ:-)
  • 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

関連する問題