JFrame没有正确调整大小

时间:2014-08-16 15:19:33

标签: java jframe size contentpane insets

当我设置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 个答案:

答案 0 :(得分:1)

覆盖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)可见之后调用{{1}}以确保所有组件都正确适合。