JPanel setPreferredSize为宽度和高度添加了两个额外的像素

时间:2016-12-13 10:56:23

标签: java swing graphics

我正在尝试正确调整JPanel的大小,使其完全适合渲染的8 x 8棋盘格。当我使用绘画程序放大时,我注意到宽度和高度都添加了两个额外的像素......

screenshot

这不是太糟糕但是当我用其他JPanel(使用BorderLayout在JFrame中的NORTH,SOUTH,EAST,WEST)环绕这个CENTER面板时,白色间隙是显而易见的。

我通过在调用setPreferredSize时减去宽度和高度的2个像素来解决这个问题,但如果这种异常是由于图形驱动程序错误造成的,那么这不是一个很好的解决方案。

好奇是否有更清洁的解决方案。下面使用JDK 7 64-BIT Windows 7 ...

提供代码
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JavaExample {

    private static final Color DARK_SQUARE_COLOR = new Color(205, 133, 63);
    private static final Color LIGHT_SQUARE_COLOR = new Color(245, 222, 179);
    private static final int SQUARE_WIDTH = 16;
    private static final int SQUARE_HEIGHT = 16;

    public JavaExample() {
        JFrame frame = new JFrame();        
        frame.add( new JPanel() {
            private static final long serialVersionUID = 1L;

            {
                setPreferredSize(new Dimension(SQUARE_WIDTH * 8, SQUARE_HEIGHT * 8));
            }

            protected void paintComponent( Graphics g ) {
                super.paintComponent(g);
                for(int row = 0; row < 8; row++) {
                    for(int col = 0; col < 8; col++) {
                        g.setColor(getSquareColor(row, col));
                        g.fillRect(col * SQUARE_WIDTH, row * SQUARE_HEIGHT, SQUARE_WIDTH, SQUARE_HEIGHT);
                    }
                }
            }

            private Color getSquareColor(int row, int col) {
                return (row + col) % 2 == 0 ? LIGHT_SQUARE_COLOR : DARK_SQUARE_COLOR;
            }
        });

        frame.pack();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible( true );
    }

    public static void main(String [] args) {
        new JavaExample();
    }
}

1 个答案:

答案 0 :(得分:1)

这不是我第一次目睹这种行为,我非常确定这是swing中的错误。在setResizable(false)已调用已JFrame的{​​{1}}上调用pack()时,总会发生这种情况。

我知道的唯一解决方案是遵循以下调用的特定顺序:

  1. frame.setResizable(false);
  2. frame.setVisible(true);
  3. frame.pack();