Странный размер 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, может сказать в своем ответе здесь.