我正在尝试正确调整JPanel的大小,使其完全适合渲染的8 x 8棋盘格。当我使用绘画程序放大时,我注意到宽度和高度都添加了两个额外的像素......
这不是太糟糕但是当我用其他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();
}
}
答案 0 :(得分:1)
这不是我第一次目睹这种行为,我非常确定这是swing
中的错误。在setResizable(false)
已调用已JFrame
的{{1}}上调用pack()
时,总会发生这种情况。
我知道的唯一解决方案是遵循以下调用的特定顺序:
frame.setResizable(false);
frame.setVisible(true);
frame.pack();