2012-03-02 43 views
8
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(); 
      } 
     }); 
    } 
} 

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

+0

窗口大于屏幕的预期行为是什么? – Thomas 2012-03-02 16:31:06

+6

@Thomas - 激怒最终用户,我相信... – mcfinnigan 2012-03-02 16:32:53

+0

此代码只适用于我的Linux机器 – Robin 2012-03-02 16:41:24

回答

10

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

+0

最短,即最佳答案 – jan 2014-04-03 07:22:20

+0

这解决了它。谢谢! – anon58192932 2014-06-11 00:00:57

3

我尝试了呼叫的几个组合,以及以下似乎工作:

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); 

它仍然打印出不同尺寸,但窗口出现要远远大于它打印。

+0

在这种情况下,尺寸改变窗户第一次移动后。最初窗口具有相同的大小。 – eXXXXXXXXXXX2 2012-03-02 16:49:43

+0

@eXXXXXXXXXXX不幸的是,这是我能做的最好的。你可以尝试添加'jf.setResizable(false);'。 – jjnguy 2012-03-02 16:50:50

+0

设置pref和min加上最小化框架“工作”在这里 - 但没有生产,因为它最有可能高度依赖于操作系统依赖记录参见@Stephen C – kleopatra 2012-03-02 17:04:06

7

的Javadoc这样说:

“的方法改变了的几何形状相关的数据。因此,该本地窗口系统可以忽略这样的请求,或者它可修改所请求的数据,从而使窗口对象。以与桌面设置密切对应的方式放置和调整大小。“

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

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

4

为了周五的乐趣(也就是说,你应该考虑在生产环境中做什么:-) - 用@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()); 
1

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

你可以拥有的未装饰框“几乎”任何大小 - 我使用1280x1024(旋转)的屏幕分辨率,并没有发现任何问题与帧1500x1500,虽然有些帧2000x2000看起来不完整(但工作)和4000x4000框架显示其拇指在任务栏,但这拇指是无效的和框架本身不会出现。我认为未修饰的JFrame的最大可能大小取决于依赖于图形硬件的系统功能。

装饰框架有一个简单的故事 - 它们可能比屏幕尺寸稍大(通常几个像素)。

在我与运行时间期间确定尺寸应用(例如游戏,其中设置板大小动态地)我使用下面的方法:

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

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

3)。包装框架

4)。如果包后的帧大小与包放置帧之前的大小不匹配,请删除内容的JPanel,将JscrollPane添加到此JPanel中,并将JScrollPane的首选大小设置为JPanel首选大小加上JScrollBar固定大小(即垂直滚动条的宽度和水平高度)。 5)。再次打包 - 这样可以确保只显示必要的滚动条(如果不增加JFrame大小,那么两个滚动条将始终显示 - 还需要删除JScrollPane默认边框)。 6)。通过向左移动并向上移动相应大小的一半来设置框架的新位置以将其居中。