setSize()不适用于JFrame

import javax.swing.JFrame; import javax.swing.SwingUtilities; class Demo { JFrame jf; Demo() { jf=new JFrame("Demo"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(5000,5000); jf.setVisible(true); System.out.println(jf.getSize()); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Demo(); } }); } } 

我为JFrame使用jf.setSize(5000, 5000) ,但之后getSize返回其他大小: java.awt.Dimension[width=1386,height=788] (我的屏幕分辨率为1366×768)我可以设置大于屏幕大小的帧大小? 可能这样的行为提供了一些框架属性,但我不知道它们。

尝试使用setPreferredSize而不是setSize。 适用于我的情况(Ubuntu 12.04 + GNOME 3)。

javadoc说:

“该方法会更改与几何相关的数据。因此,本机窗口系统可能会忽略此类请求,或者它可能会修改所请求的数据,以便以与桌面设置紧密对应的方式放置和调整Window对象的大小。”

这涵盖了您正在观察/抱怨的行为。

它不是很清楚,但Window.setSize(...)具有这种行为的一个原因是窗口管理器(Java之外)通常会否决应用程序尝试执行此操作。 据推测,那是因为它是滥用和“不是用户想要的”。 无论如何,最终不是您的应用程序调用覆盖窗口管理器的限制。

只是为了星期五的乐趣(也就是说,你应该考虑在生产环境中做什么:-) – 使用@jinguy代码进一步播放,我注意到在最小化帧之后使用了超过生命的大小。 以编程方式执行此操作让它从一开始就显示为怪物

  jf.setPreferredSize(new Dimension(5000,5000)); jf.setMinimumSize(new Dimension(5000,5000)); jf.pack(); jf.setVisible(true); jf.setState(Frame.ICONIFIED); jf.setState(Frame.NORMAL); System.out.println(jf.getSize()); 

我尝试了一些调用组合,以下似乎有效:

 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setPreferredSize(new Dimension(5000,5000)); jf.setMaximumSize(new Dimension(5000,5000)); jf.setMinimumSize(new Dimension(5000,5000)); jf.pack(); jf.setVisible(true); 

它仍然打印出不同的尺寸,但窗口看起来比它打印的要大得多。

这些是我的观察(使用1.6,现在我在XP下使用1.7):

您可以拥有“几乎”任何尺寸的未装饰框架 – 我使用1280×1024的屏幕分辨率(旋转)并没有发现框架1500×1500有任何问题,虽然有些框架2000×2000看起来未完成(但工作)和框架4000×4000显示其拇指在任务栏中,但此拇指不活动,框架本身不会出现。 我认为未修饰的JFrame的最大可能大小取决于依赖于图形硬件的系统function。

装饰框架有一个简单的故事 – 它们可能比屏幕尺寸略大(一般只有几个像素)。

在运行时确定大小的应用程序中(例如动态设置板大小的游戏)我使用以下方法:

1)。 在打包之前设置相对于null的框架位置。 它将JFrame的左上角放在屏幕的中间(在打包之前,JFrame的尺寸为(0,0))

2)。 设置我的框架内容的首选大小(我总是使用单个JPanel)并记住它们

3)。 打包框架

4)。 如果pack之后的帧大小与pack之前的帧配置不匹配,请删除内容的JPanel,使用此JPanel添加JScrollPane并将JScrollPane的首选大小设置为JPanel首选大小PLUS JScrollBar固定维度(即垂直滚动条的宽度和水平的高度)。

5)。 再次打包 – 这保证只显示必要的滚动条(如果你不增加JFrame大小,那么两个滚动条总会出现 – 还需要删除JScrollPane默认边框)。

6)。 通过向左和向上移动相应大小的一半来设置框架的新位置以使其居中。