1

当我设置 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);

所以使用插图不起作用,使用新的 ContentPane 也不起作用我希望它足够清楚。

编辑:它现在正在工作我用 Canvas 扩展了类,将它的大小设置为宽度和高度,然后将它添加到 JFrame 然后打包它。这行得通!但是为什么我认为导致它的原因不是尺寸而是我渲染它的方式,我从 JFrame 而不是画布获得了 bufferStrategy,这不是它应该的方式。

4

1 回答 1

1

覆盖getPreferredSize()以设置JPanel.

示例代码:

JPanel panel =new JPanel (){

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

请参阅我应该避免在 Java Swing 中使用 set(Preferred|Maximum|Minimum)Size 方法吗?


使用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


为什么要设置新的内容窗格JFrameframe.getContentPane().add(panel)只需使用或添加默认内容窗格frame.add(panel)

在使其可见后最后调用frame.setResizable(false)以确保所有组件都正确安装。

于 2014-08-16T16:23:37.840 回答