java - 如何在我的自定义控件中实现类似 JLabel 的大小管理?

标签 java swing jcomponent

在下面的代码中,JFrame 仅包含 JLabel,位于 BorderLayout 的中心。

package test.swing;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Try_JLabel_01 {

    public static void main(String[] arg) {

        JFrame frame = new JFrame() {

            JLabel label = new JLabel("label");

            {
                setLayout(new BorderLayout());
                add(label, BorderLayout.CENTER);
            }

        };

        frame.pack();
        //frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);


    }

}

如果运行,该程序会显示窗口,它正好适合控件大小。

同时,如果我定义自定义控件,则默认窗口大小为零:

public class Try_JLabel_02 {

    public static void main(String[] arg) {

        JFrame frame = new JFrame() {

            //JLabel label = new JLabel("label");
            JComponent label = new JComponent() {

                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);

                    g.setColor(Color.RED);
                    g.fillOval(0, 0, 200, 100);
                }
            };


            {
                setLayout(new BorderLayout());
                add(label, BorderLayout.CENTER);
            }

        };

        frame.pack();
        //frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);


    }

}

如何正确扩展 JComponent,使其表现得像 JLabel,例如,默认大小为 200x100?

附言我不想扩展 JLabel。我想了解 JLabel 如何扩展 JConmponent

我看到了 JLabel 的源代码,但我不明白,他们是如何控制大小的。实际上我在那里根本看不到任何大小控制代码。

更新

我发现如果我不覆盖可以解决这个任务,但是如果我设置尺寸:

//JLabel label = new JLabel("label");
        JComponent label = new JComponent() {

            {
                setMinimumSize(new Dimension(200, 100));
                setPreferredSize(new Dimension(200, 100));
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);

                g.setColor(Color.RED);
                g.fillOval(0, 0, 200, 100);
            }
        };

但这只适用于我自己知道尺寸的情况。对于字体,如果没有 Graphics 对象,我无法知道大小。

那么如何确定字体的大小呢?

最佳答案

JLabel(和其他组件)能够生成您所看到的结果的原因是因为它们向父容器提供了有用的大小提示,它的布局管理器使用它来做出关于如何最好地布局子组件。

pack 使用所有这些信息来确定您调用它时制作窗口的最佳可能大小。

默认情况下,JComponent 的首选大小是 0x0,这对您不是很有帮助。首先重写组件 getPreferredSize 方法并返回,例如 new Dimension(200, 200);

现在,请记住,每个布局管理器使用不同的信息来做出决定,您可能还需要查看 getMinimumSizegetMaximumSize

关于java - 如何在我的自定义控件中实现类似 JLabel 的大小管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19233499/

相关文章:

java - 如何将 blob 转换为 JSP 中显示的图像

java - IntelliJ spring boot 项目中有很多损坏的源代码和类路径错误?

java - 将鼠标事件分派(dispatch)到最深的可见 JComponent

java - 将 JComponent 中的绘图保存到 Tiff 文件中

java - 如何在 JPanel 中为长 JComponent 添加滚动条?如何使 JComponent 居中?

java - 如何阻止另一个类中的 JComponent?

java - 反射无法获取从泛型类型接口(interface)重写的方法的实际参数类型?

java - Graphics2D.draw 中的斜接限制错误

java - 图形对象上的 MouseListener

java - 如何使用 SwingWorker 和/或 Timer?