【问题标题】:setSize() doesn't work for JFramesetSize() 不适用于 JFrame
【发布时间】:2012-03-21 03:55:08
【问题描述】:
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](我的屏幕分辨率为 1366x768)我可以将帧尺寸设置为大于屏幕尺寸吗?可能这种行为是由一些框架属性提供的,但我不知道它们。

【问题讨论】:

  • 比屏幕大的窗口的预期行为是什么?
  • @Thomas - 我相信激怒了最终用户...
  • 这段代码只能在我的 Linux 机器上运行
  • 也许是操作系统?在 vista 上,框架/窗口不能(很多?不知道,还有几个像素)大于显示器尺寸,我得到 [width=1702,height=1072]

标签: java swing jframe


【解决方案1】:

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

【讨论】:

  • 最短,即最佳答案
【解决方案2】:

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

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

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

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

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

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

3)。装帧

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

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

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

【讨论】:

    【解决方案3】:

    只是为了周五的乐趣(也就是说,你不应该考虑在生产环境中做任何事情 :-) - 进一步使用 @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());
    

    【讨论】:

      【解决方案4】:

      javadoc 是这样说的:

      "该方法更改几何相关数据。因此,本机窗口系统可能会忽略此类请求,也可能会修改请求的数据,从而以紧密对应的方式放置和调整 Window 对象到桌面设置。”

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

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

      【讨论】:

        【解决方案5】:

        我尝试了几种调用组合,以下似乎可行:

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

        它仍然打印出不同的大小,但窗口似乎比打印的大得多。

        【讨论】:

        • 在这种情况下,大小在第一次移动窗口后改变。最初窗口的大小相同。
        • @eXXXXXXXXXXX 不幸的是,这是我能做的最好的。您可以尝试添加jf.setResizable(false);
        • 设置 pref 和 min 并在此处最小化“工作”框架 - 但是对于生产没有任何影响,因为它很可能高度依赖于操作系统,如文档所述,请参阅@Stephen C
        • @kleopatra 感谢您提供有趣的周五信息。
        猜你喜欢
        • 2016-03-15
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多