奇怪的JFrame大小

时间:2014-07-05 05:30:54

标签: java swing jframe size

所以我设置了setSize(500,500)..添加一些面板,面板的总和Y是500,就像JFrame一样,但是执行它显示的计数Y是525 am我错过了什么?

JPanel panel = new JPanel();
    panel.setLayout(null);
    getContentPane().add(panel);
//--------------------

    JPanel top_panel = new JPanel();
    top_panel.setLayout(null);
    top_panel.setBackground(Color.blue);
    top_panel.setBounds(0, 0, 500, 40);
    panel.add(top_panel);

    //------------------------------

    JPanel middle_panel = new JPanel();
    middle_panel.setLayout(null);
    middle_panel.setBackground(Color.yellow);
    middle_panel.setBounds(0, 40, 500, 385);
    panel.add(middle_panel);

    //-----------------------------

    JPanel bottom_panel = new JPanel();
    bottom_panel.setLayout(null);
    bottom_panel.setBackground(Color.black);
    bottom_panel.setBounds(0, 425, 500, 75);
    panel.add(bottom_panel);

    setSize(500,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setLocationRelativeTo(null);

40 + 385 + 75 = 500但要显示我必须

的所有面板
setSize(500,525);

然后它适合

这是一张图片: enter image description here

2 个答案:

答案 0 :(得分:3)

框架大小是包括标题栏在内的浅蓝色矩形。您的面板出现在内部边界中,框架大小小于框架边框和框架标题栏。您是否看到底部标记的空间与标题栏的高度奇怪相同?

将面板/组件添加到框架中并在调用frame.setVisible(true)之前,调用frame.pack()。

如果您拥抱布局管理器(例如FlowLayout)并在必要时调用setPreferredSize并让布局管理器执行布局,那也更为可取。通常可以通过setBound,setSize,setMininumSize,setMaximumSize调用setPreferredSize。

import javax.swing.*;
import java.awt.*;

public class FrameSize {

    private JFrame frame;

    FrameSize create() {

        frame = createFrame();
        frame.getContentPane().add(createContent());

        return this;
    }

    private JFrame createFrame() {
        JFrame frame = new JFrame(getClass().getName());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        return frame;
    }

    void show() {
        //   frame.setSize(500, 500);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    private Component createContent() {
        JPanel panel = new JPanel(null);

        JPanel topPanel = new JPanel(null);
        topPanel.setBackground(Color.blue);
        topPanel.setBounds(0, 0, 500, 40);
        panel.add(topPanel);

        JPanel middlePanel = new JPanel(null);
        middlePanel.setBackground(Color.yellow);
        middlePanel.setBounds(0, 40, 500, 385);
        panel.add(middlePanel);

        JPanel bottomPanel = new JPanel(null);
        bottomPanel.setBackground(Color.black);
        bottomPanel.setBounds(0, 425, 500, 75);
        panel.add(bottomPanel);

        panel.setPreferredSize(new Dimension(500, topPanel.getBounds().height + middlePanel.getBounds().height + bottomPanel.getBounds().height));
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new FrameSize().create().show();
            }
        });
    }
}

答案 1 :(得分:3)

您不应该设置尺寸或致电setSize(...)setBounds(...),以便将来为类似的问题做好准备,或者当您尝试展示自己时出现更严重的问题GUI在不同的平台上。而是让您的组件的首选大小和布局管理器为您工作。如果您绝对必须设置组件的大小,请覆盖getPreferredSize()并返回一个计算适合您的维度。是的,根据javajon,您应该在显示它之前在JFrame上调用pack()

有关null布局的更多讨论,请阅读本网站上最好的Swing专家之一,MadProgrammer,在他的回答here中说。