Странный размер JFrame

Поэтому я установил setSize(500,500).. добавьте несколько панелей, сумма панелей Y равна 500, как в JFrame, но при выполнении этого показа счетчик Y равен 525. Я что-то упустил?

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);

тогда подходит

вот изображение:

2 ответа

Решение

Размер кадра - светло-синий прямоугольник за пределами границ, включая строку заголовка. Ваши панели появляются во внутренних границах, размер которых меньше размера рамки и строки заголовка кадра. Видите ли вы, как ваше отмеченное пространство внизу странно такой же высоты, как заголовок?

После добавления ваших панелей / компонента в фрейм и непосредственно перед вызовом frame.setVisible (true) вызовите frame.pack().

Было бы также предпочтительнее, если вы включите менеджер макета (например, FlowLayout) и при необходимости вызовите setPreferredSize и позволите менеджеру макета сделать макет. Обычно можно вызвать setPreferredSize для setBound, setSize, setMininumSize, setMaximumSize.

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();
            }
        });
    }
}

Вы не должны устанавливать размер или звонить setSize(...) или же setBounds(...) так как это настраивает вас на подобные проблемы в будущем или на худшие проблемы, когда вы пытаетесь показать свой графический интерфейс на другой платформе. Вместо этого позвольте предпочитаемым размерам ваших компонентов и менеджерам компоновки сделать эту работу за вас. Если вам абсолютно необходимо установить размер компонента, переопределите getPreferredSize() и верните измерение, рассчитанное для вас. И да, согласно javajon, вы должны позвонить pack() на JFrame перед его отображением.

Для дальнейшего обсуждения нулевого макета, пожалуйста, прочитайте, что один из лучших экспертов Swing на этом сайте, MadProgrammer, может сказать в своем ответе здесь.

Другие вопросы по тегам