Images in JTable cells off by one pixel?

后端 未结 1 1057
终归单人心
终归单人心 2021-01-22 15:36

So, I\'m able to load images into my JTable\'s cells now, but for some reason the graphics are all shifted to the right by one pixel, allowing me to see the JTable\'s background

相关标签:
1条回答
  • 2021-01-22 16:02

    Not entirely sure what you mean by "one pixel off" - but achieve zero intercell spacing without any visual artefacts you have to both zero the margins and turn off the grid lines:

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

    Edit

    Okay, looking closer, there are several issues with your code

    • you do the column sizing indirectly instead of directly (and yet another nice example why to never-ever do a component.setPreferredSize :-)
    • the renderer's border takes some size

    to fix the first, configure each column's width, table layout will automagically configure its itself

        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);
        }
    

    for the second, null the border in each call:

    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 讨论(0)
提交回复
热议问题