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

时间:2013-10-07 19:55:20

标签: 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?

P.S。我不想延长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对象,我无法知道大小。

那么如果在字体的情况下如何确定尺寸?

2 个答案:

答案 0 :(得分:5)

JLabel(以及其他组件)可以生成您看到的结果的原因是因为它们向父容器提供了有用的大小提示,它的布局管理器使用它来决定如何最好地使用布局子组件。

pack使用所有这些信息来确定调用窗口时制作窗口的最佳尺寸。

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

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

答案 1 :(得分:5)

  

我不想延长JLabel

如果您不想展开JLabel,可以使用Container填充所附EmptyBorder,如图所示here