【问题标题】:The application automatically adds 10 pixels to width and height应用程序自动将宽度和高度增加 10 个像素
【发布时间】:2013-07-06 21:48:06
【问题描述】:

我的问题很奇怪,在搜索和阅读代码 40 次之后,我无法解释为什么 jpanel 和 jframe 的宽度和高度增加了 10 个像素。

代码是:

public class Game extends JPanel implements Runnable {

        public static final String NAME = "ALPHA !";

        public static final int WIDTH = 600, HEIGHT = 400;

        public static void main(String[] args) {
            Game game = new Game();
            game.setMinimumSize(new Dimension(WIDTH, HEIGHT));
            game.setMaximumSize(new Dimension(WIDTH, HEIGHT));
            game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
            game.setFocusable(true);
            game.requestFocusInWindow();

            JFrame frame = new JFrame(NAME);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.setLayout(new BorderLayout());
            frame.add(game, BorderLayout.CENTER);
            frame.pack();

            frame.setResizable(false);
            frame.setAlwaysOnTop(true);
            frame.setLocationRelativeTo(null);

            frame.setVisible(true);
            game.startGame();
        }

        public void startGame() {
            System.out.println("w " + getWidth() + ", h " + getHeight());
            new Thread(this).start();
        }
}

startGame 方法中的 println 打印:

w 610, h 410

提前致谢。

【问题讨论】:

  • 这是(不是很清楚)使用setResiabled 的问题,请查看this answer 了解更多详情。另外,我想到了一些事情 - 首先,不要尝试将框架的大小设置为静态大小,而是将其内容的首选大小设置为您想要的大小并让框架填充它。框架具有占用空间的边框,因此使用(例如)600x400 可能只会产生 590x395 的可用区域(或小于您指定的区域)
  • @MadProgrammer 感谢您将我链接到的答案,我发现我应该在 setResizable() 之后打包。
  • 不要设置顶级容器的大小。而是布局内容并致电pack()
  • @AndrewThompson 是的,但如果你先调用setResizable,然后再调用pack,它仍然会为帧增加10个像素:P

标签: java swing jframe jpanel


【解决方案1】:

使用frame.setUndecorated(true)你就会明白为什么高宽都增加了10px。

【讨论】:

  • 我认为这不会有什么不同,API 中有一个合适的错误,即如果您将窗口设置为不可调整大小、装饰与否,它会在窗口大小上增加 10 个像素。花了我很长时间来诊断它:P - 此外,在窗口中添加了一个框架边框,而不是在它上面
  • @MadProgrammer:我认为禁用或启用此框架的装饰会有所不同,仅当可调整大小为true 时才如此,但在您发表评论后,我发现我犯了一个错误,谢谢,不需要谈判,因为你是对的:)。
  • @AndrewThompson:我承认这是一个糟糕的答案,因为缺乏信息。
  • 而那个 -1 的出现留下了糟糕的答案,而不是 让它 成为评论..
  • @AndrewThompson:我希望我得到更多的反对票,不要再重复了,所以,在这种情况下,我会感谢反对票。
【解决方案2】:

我在尝试将单个自定义 JPanel 添加到充当画布的 JFrame 时遇到了这个问题。我正在使用 Java 8(更新 231),这仍然是一个问题。

我不完全知道为什么会这样。最后,可以通过在 JFrame 上的 frame.setVisible(true) 之后调用 frame.setResizable(false) 来解决此问题。

由于我在这里聚会迟到了,我希望这也能帮助那些在这方面苦苦挣扎的人。

祝你有美好的一天

编辑:刚刚看到答案下方的 cmets 通过将 frame.setResizable(false) 移动到 frame.pack() 之前提出了相同的建议,这也可以。很抱歉再次提出这个问题.. :)

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多