代码之家  ›  专栏  ›  技术社区  ›  Bram Hoven

JFrame大小不正确

  •  1
  • Bram Hoven  · 技术社区  · 10 年前

    当我设置JFrame的大小时,它会设置帧本身的大小,包括边框。 我尝试创建一个新的内容面板,并设置其大小,而不是设置框架本身的大小,但它不起作用。这里是代码:

    frame = new JFrame();
    JPanel jp = new JPanel();
    frame.setTitle(title);
    //frame.setSize(width, height);
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //insets = frame.getInsets();
    //frame.setSize(new Dimension(insets.left + width + insets.right, insets.top + height + insets.bottom));
    jp.setPreferredSize(new Dimension(width, height));
    frame.setContentPane(jp);
    frame.pack();
    frame.setVisible(true);
    

    因此,使用insets不起作用,使用新的ContentPane也不起作用。我希望它足够清楚。

    编辑: 现在我用Canvas扩展了类,将其大小设置为宽度和高度,然后将其添加到JFrame中,然后打包!但为什么我认为这不是因为大小,而是我呈现它的方式,我从JFrame中获得了bufferStrategy,而不是画布,这不是应该的方式。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Community CDub    7 年前

    推翻 getPreferredSize() 设置 JPanel .

    示例代码:

    JPanel panel =new JPanel (){
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(..., ...);
        }
    }
    

    看见 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?


    使用 SwingUtilities.invokeLater() EventQueue.invokeLater() 确保 EDT 正确初始化。

    示例代码:

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                // GUI related code goes here (not heavy task)
            }
        });
    }
    

    看见 SwingUtilities.invokeLater


    为什么要设置的新内容窗格 JFrame ? 只需使用 frame.getContentPane().add(panel) frame.add(panel)

    呼叫 frame.setResizable(false) 在使其可见后,确保所有组件都正确安装。

    推荐文章