setSize()不适用于JFrame

时间:2012-03-02 16:28:43

标签: java swing 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();
            }
        });
    }
}

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

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

javadoc说:

  

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分: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);

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

答案 4 :(得分:1)

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

你可以拥有“几乎”任何尺寸的未装饰框架 - 我使用1280x1024(旋转)的屏幕分辨率并没有注意到框架1500x1500的任何问题,虽然有些框架2000x2000看起来未完成(但工作)和框架4000x4000在任务栏中显示其拇指,但此拇指处于非活动状态,并且框架本身不会出现。我认为未修饰的JFrame的最大可能大小取决于系统功能,这取决于图形硬件。

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

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

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

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

3)。打包框架

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

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

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