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

标签 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. 为什么第二个输出中椭圆形变成了三角形?

最佳答案

Why isn't pack() working as expected in the first case? Shouldn't I see the full circle instead of seeing half of it?

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

添加

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

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

Why did the oval turn into a triangle in the second output?

这就是 BorderLayoutFlowLayout 之间的区别

关于java - `pack()` 和 `setLayout()` 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31184014/

相关文章:

java - 当屏幕关闭时,Android 服务似乎会暂停

java - Android 加速度计和磁力计同时读数

java - <匿名按钮>不是抽象的

java - 我有一个项目要求我创建按钮,用户输入圆的半径和位置,然后用户单击按钮来绘制圆

c++ - RGBA 整数值到 OpenGL 纹理

r - 如何使用 R 删除 coplot 中的 "Given"

java - Spring Security对用户进行身份验证时如何在 session 中管理自定义用户对象?

java - 为了邮寄需要重启服务器

java - JTable 通过与字符串的精确匹配进行过滤

Java:JLayeredPane 和直线或圆