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

时间:2015-07-02 11:56:40

标签: 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);
        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);

如果我运行该程序,我会得到输出:

OUTPUT-1

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

OUTPUT-2

两个问题:

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

2 个答案:

答案 0 :(得分:2)

  

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

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

添加

@Override
public Dimension getPreferredSize() {
    return new Dimension(50, 50);
}
在进行任何自定义绘画之前,

mainPanelsuper.paintComponent(g)paintComponent方法

  

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

这将是BorderLayoutFlowLayout

之间的差异

答案 1 :(得分:1)

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

如此处https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html所示,第4项:

pack方法调整框架的大小,使其所有内容都达到或超过其首选大小。 pack的替代方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。通常,使用pack比调用setSize更好,因为pack离开框架布局管理器负责框架大小,布局管理器擅长调整平台依赖性和影响组件大小的其他因素。

要解决此问题,请使用setBoundssetSize或添加首选尺寸的组件。

希望有帮助=)