Java Swing 设置“实际”框架大小(内部)

19

我有一个只包含一个JPanel的JFrame窗口。

我尝试设置面板的大小并对框架进行压缩,但没有效果。

如果我设置JFrame的大小,它将改变大小以包括标题栏和边框。

如何设置“实际大小”,使其不包括标题栏和边框?

例如:

Example

提前感谢大家。

6个回答

20

您可以设置contentPane的preferredSize并在JFrame上调用pack,但通常最好让组件根据它们的布局管理器确定的首选大小自行调整大小。


是的,但这是一个只有面板的应用程序,图形将在其中绘制,因此大小必须非常准确。 - CookieMonster

12

以下是设置JPanel大小并对框架进行打包的示例:

JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200, 200));
frame.add(panel);
frame.pack();
frame.setVisible(true);

你尝试过类似这样的东西吗?


没错,就像 hovercraft-full-of-eels 说的那样,确实可以正常工作。 - CookieMonster
我只看到他发了一次帖子,而那时我已经发了我的 :) - Tulio
1
没问题,伙计,我也给你点了赞 :) 尽管这次我已经弄明白了,但有时候我真的离不开一个例子 :) - CookieMonster
2
Kleopatra,如果您知道如何修复,请告诉我们:使用setSize而不是setPreferredSize的相同代码无法正常工作。 - Tulio

10

如果您设置了JPanel的首选大小,那么JFrame的pack()方法将会遵守该大小。


是的,因为我假设它被添加到contentPane的BorderLayout.CENTER位置——但如果其他东西被添加到另一个BorderLayout位置,它会搞乱事情。 - Hovercraft Full Of Eels
@Andrew,抱歉,我做了很多假设,但是假设OP希望设置GUI大小,但不包括边框、菜单等等,如果只调整BorderLayout.CENTER组件并将其他组件添加到其他BorderLayout位置,则最终GUI大小可能会出错。但我的假设是不正确的,因为OP主要关心容纳图像的组件的大小。所以Vincent是正确的,我很快就会删除我的第一条评论,并删除对您的评论。 - Hovercraft Full Of Eels

4
使用JFrame.getInsets 方法可以给出非客户端区域周围的尺寸。然后将其加到所需的大小上,并使用setSize 来设置大小。

2
如果您想获得框架边框,那么首先在您的框架上使用 pack,然后像以下代码中一样获取框架 Insets
frame.pack();
Insets insets = frame.getInsets();
int frameLeftBorder = insets.left;
int frameRightBorder = insets.right;
int frameTopBorder = insets.top;
int frameBottomBorder = insets.bottom;

最好在调用 setResizable(boolean) 方法后立即使用 pack 方法,因为可调整大小的窗口会改变窗口边框大小。如果您不使用可调整大小方法,则应该在构造函数的开头使用 pack 方法。请注意保留 HTML 标签。

1
哇,短时间内两个踩,看来帮助别人甚至都不值得。 - Martin Krajčírovič

0

设置JFrame中可用空间的实际大小可以通过在createComponents(Container container)方法中设置容器的首选大小来完成。通过这种方式,您可以跳过在run()方法中通过setPreferredSize(new Dimension(width, length))设置整个JFrame的大小。因此,代码将如下所示:

@Override
public void run() {
    JFrame frame = new JFrame();
    // other code ...
    this.createCompoents(frame.getContentPane());
}

private void createCompoents(Container container) {
   // other code ...
   container.setPreferredSize(new Dimension(width, length));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接