【问题标题】:Issues with `pack()` and `setLayout()``pack()` 和 `setLayout()` 的问题
【发布时间】:2015-09-19 22:47:59
【问题描述】:

我有代码

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,我会得到输出:

两个问题:

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

【问题讨论】:

    标签: java swing graphics flowlayout


    【解决方案1】:

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

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

    添加

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }
    

    在您进行任何自定义绘画之前,将 mainPanelsuper.paintComponent(g) 发送给您的 paintComponent 方法

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

    这就是BorderLayoutFlowLayout 之间的区别

    【讨论】:

    • 感谢您的回答。 super.paintComponent(g) 是做什么的?
    • 没关系。 Found it
    【解决方案2】:

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

    这里明确指出https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html,第 4 项:

    pack 方法调整框架的大小,使其所有内容都等于或大于它们的首选大小。 pack 的替代方法是通过调用 setSize 或 setBounds (也设置帧位置)显式建立帧大小。一般来说,使用 pack 比调用 setSize 更可取,因为 pack 让框架布局管理器负责框架大小,而布局管理器擅长调整平台依赖性和其他影响组件大小的因素。

    要解决此问题,请使用 setBoundssetSize 或添加具有首选大小的组件。

    希望对你有帮助 =)

    【讨论】:

    • 不建议使用 setSize 或 setBound ,因为父容器正在使用布局管理器,这将覆盖您指定的任何内容
    • 你好,@MadProgrammer,你介意解释一下吗?我的意思是某种场景?我看到了你的回答,我有点喜欢它
    • 问题是,布局管理器会根据它的算法进行自己的计算,并按照它想要的方式设置组件的大小。因此,当重新验证父容器时,您设置的任何内容都将被丢弃
    • 我明白了。但是在这种情况下,您是在谈论组件的大小,对吗?我的答案是基于对话框本身的大小。但我明白了你的意思,我相信这两种方法都是正确的。选择一个或另一个将取决于具体情况。无论如何,谢谢你的解释
    • 个人。我更喜欢打包,因为它是一种独立于系统的方式来确保窗口大小正确,但这就是我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2011-09-20
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多