根据屏幕分辨率设置Java JFrame窗口大小

17

我使用myEclipse Matisse创建了Java GUI。当我的屏幕分辨率为1024x768时,它可以正常工作,但是当我更改分辨率时,我的GUI不正常工作。 我希望我的GUI窗口可以根据屏幕分辨率重新调整大小。我正在扩展JFrame以创建主窗口。

public class MyClass extends JFrame {

    //I am putting some controls here.

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(0,0,screenSize.width, screenSize.height);
    setVisible(true);

    pack();
}

无论我怎么做,设置大小硬编码或使用ToolKit进行设置,这都不起作用,窗口尺寸始终保持不变。


顺便提一下,考虑到代码无法编译,它不起作用并不令人惊讶。将来,请考虑发布一个SSCCE来演示编码问题。 - Andrew Thompson
顺便提一下,当使用多个显示器运行时,Toolkit.getScreenSize()将返回主显示器的大小,这可能不是显示您的框架的显示器,并且可能大小不同(例如带有外部监视器的笔记本电脑)。 - Rangi Keen
7个回答

36
你可以尝试使用这个来最大化框架:
this.setExtendedState(JFrame.MAXIMIZED_BOTH);

1
+1,因为这是第一个不建议删除pack()调用的答案。 ;) - Andrew Thompson
4
我曾经是给你点踩的人,因为一开始我觉得它没有回答楼主的问题。对此我很抱歉。现在我看到这是一个可以接受的答案,所以我会点个赞 :) - Petar Minchev

17
您正在调用pack()方法,该方法会更改框架大小以适应其中的组件。我认为这就是它会收缩回去的原因。请删除pack()代码行,然后它应该可以工作。

1
-1,真的吗?!?!我正在解释为什么它不起作用...有时候你不需要这个包。这取决于他... - Petar Minchev
有时候你不需要打包。当然,除了“当你不向帧添加任何内容时”,还有哪些情况包含在这个“有时候”中呢? - Andrew Thompson
请看第4点:http://download.oracle.com/javase/tutorial/uiswing/components/frame.html 。pack()方法比setSize()方法“更好”。但是不使用它并不是错误的。 - developmentalinsanity
2
@同样的观点补充道:“..包将框架布局管理器置于框架大小的控制下,而布局管理器擅长调整平台依赖性和其他影响组件大小的因素。”那么现在我们要把“有时候”加上null布局吗?这会更糟。即使您在整个框架的内容区域进行自定义绘画,该绘画也需要在添加到框架的JComponent中完成。当您添加它时,使用布局管理器*轻而易举地调整组件的大小和位置。 - Andrew Thompson
布局管理器不负责框架大小并不意味着您没有使用布局管理器。在最大化的窗口中(例如您喜欢的Kowser回答),布局管理器不负责窗口大小,必须在固定大小内放置组件。如果不使用pack,则会产生相同的场景,只是窗口大小不一定占据整个屏幕。 - developmentalinsanity
3
"布局管理器不负责窗口大小,必须在固定尺寸内对组件进行布局。" 没有人说过布局管理器要负责全屏窗口的大小(或应该负责)。布局管理器负责窗口子元素的大小和布局。 - Andrew Thompson

7
另一种方法是:
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
pack();
setSize(screenSize.width,screenSize.height);

为什么在调用setSize之前要调用pack()? - gumuruh

5

在GUI的正确运行中,调用pack()是至关重要的。在所有组件添加完毕后调用它,以使其验证容器并将其设置为自然大小。

然后在之后调用setSize()和相关方法,如setBounds()


我在使用pack()之后,尝试了一些调整大小的代码,但对我来说没有起作用。 - Syed Muhammad Mubashir

0

请尝试以下操作: 选择JFrame的所有组件,右键点击,选择“自动调整大小”,勾选水平和垂直两个选项,关闭。


-2

调用pack()通常会导致窗口被调整大小以适应内容的首选大小。尝试删除对pack()的调用,看看会发生什么。


1
pack() 移动,不要删除它。 - Andrew Thompson

-5
首先,为框架设置边界,然后移除pack()方法。

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