Java `pack()`和`setLayout()的问题`

Java `pack()`和`setLayout()的问题`,java,swing,graphics,flowlayout,Java,Swing,Graphics,Flowlayout,我有密码 import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.FlowLayout; class GUI extends JFrame { JPanel mainPanel; public GUI(String header) { super(header); setDefaultCloseOpera

我有密码

import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Graphics;
import java.awt.FlowLayout;

class GUI extends JFrame {

    JPanel mainPanel;

    public GUI(String header) {

        super(header);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //setLayout(new FlowLayout(FlowLayout.CENTER));

        init();

        add(mainPanel);
        pack();
    }

    public void init() {
        mainPanel = new JPanel(){
            @Override
            public void paintComponent(Graphics g) {
                g.fillOval(0, 0, 50, 50);
            }
        };
    }
}
我的主要方法是

GUI progam = new GUI("Title");
progam.setLocationRelativeTo(null);
progam.setVisible(true);
如果我运行程序,我会得到输出:

如果我取消注释
setLayout
,我会得到以下输出:

两个问题:

  • 为什么在第一种情况下,
    pack()
    不能按预期工作?我不应该看到整个圆圈而不是它的一半吗
  • 为什么在第二次输出中椭圆形变成三角形
  • 为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗

    是的,
    mainPanel
    没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)

    在您进行任何自定义绘制之前,请向您的
    mainPanel
    super.paintComponent(g)
    发送到您的
    paintComponent
    方法

    为什么在第二次输出中椭圆形变成三角形

    这就是
    BorderLayout
    FlowLayout

    为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗

    是的,
    mainPanel
    没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)

    在您进行任何自定义绘制之前,请向您的
    mainPanel
    super.paintComponent(g)
    发送到您的
    paintComponent
    方法

    为什么在第二次输出中椭圆形变成三角形

    这就是
    BorderLayout
    FlowLayout

    为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗

    是的,
    mainPanel
    没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)

    在您进行任何自定义绘制之前,请向您的
    mainPanel
    super.paintComponent(g)
    发送到您的
    paintComponent
    方法

    为什么在第二次输出中椭圆形变成三角形

    这就是
    BorderLayout
    FlowLayout

    为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗

    是的,
    mainPanel
    没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)

    在您进行任何自定义绘制之前,请向您的
    mainPanel
    super.paintComponent(g)
    发送到您的
    paintComponent
    方法

    为什么在第二次输出中椭圆形变成三角形


    这就是
    BorderLayout
    FlowLayout

    之间的区别,当您在JPanel中绘制时,实际上没有将组件放在其中,因此它没有任何尺寸(宽度、高度)以及JPanel

    如此处所述,第4项:

    包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。 要解决此问题,请使用
    setBounds
    setSize
    或添加具有首选尺寸的组件


    希望它有帮助=)

    当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel

    如此处所述,第4项:

    包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。 要解决此问题,请使用
    setBounds
    setSize
    或添加具有首选尺寸的组件


    希望它有帮助=)

    当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel

    如此处所述,第4项:

    包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。 要解决此问题,请使用
    setBounds
    setSize
    或添加具有首选尺寸的组件


    希望它有帮助=)

    当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel

    如此处所述,第4项:

    包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。通常,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长调整以适应平台de
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }