如何使JFrame的像素大小准确?

时间:2015-03-10 04:18:55

标签: java swing jpanel

我正在尝试将某些特定图形绘制到JPanel(添加到JFrame上),就像网格一样。我使用框架的长度和宽度来确定网格上单元格的大小。当网格被绘制时,它不适合默认的帧大小,我需要手动重新调整框架大小以便能够看到整个网格。在我的例子中:

我有600x600的画面。 我想绘制一个20x20网格。 因此,每帧应为30x30像素。

我绘制网格,这是代码完成后发生的事情:

enter image description here

我试图找到修复此问题的方法,但每个人都说要使用frame.pack(),因为我没有使用(添加)任何JComponent个对象,因此我无法使用{{1}}在面板中,它都是自定义渲染。

2 个答案:

答案 0 :(得分:2)

  

但是每个人都说要使用frame.pack()

哪个是正确的。

  

我没有在面板中使用(添加)任何JComponent对象,它都是自定义渲染的。

如果您没有在面板中添加组件,那么您正在面板上进行自定义绘画。因此,您需要覆盖自定义绘图面板的getPreferredSize()方法以返回面板的大小,以便pack()方法可以正常工作。

@Override
public Dimension getPreferredSize()
{
    return new Dimension(600, 600);
}

现在当你打包()框架时,框架尺寸将是面板的大小,加上框架上的装饰尺寸(标题栏,边框),无论你使用什么操作系统或LAF。

答案 1 :(得分:0)

我相信您的问题是,在为JFrame指定尺寸时,编译器会从给定尺寸获取边框(插入)的尺寸。这导致窗口的显示部分比指定的尺寸略小。解决此问题的方法是将插图的尺寸添加到框架尺寸中:

setSize(600+getInsets().right+getInsets().left,600+getInsets().top+getInsets().bottom);

或者如果您想使用SetSize(Dimension):

Dimension d = new Dimension(600+getInsets().right+getInsets().left,600+getInsets().top+getInsets().bottom);
setSize(d);