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

Suz*_*ioc 1 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);


    }

}
Run Code Online (Sandbox Code Playgroud)

如果运行,该程序将显示窗口,该窗口完全符合控件大小.

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

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);


    }

}
Run Code Online (Sandbox Code Playgroud)

如何正确扩展JComponent,使其行为类似于JLabel,例如,默认大小为200x100?

PS我不想延长JLabel.我想学习如何JLabel扩展JConmponent.

我看到源代码JLabel,但我无法理解,他们如何控制尺寸.实际上我根本没有看到任何尺寸控制代码.

UPDATE

我发现,如果我不覆盖,可以解决任务,但如果我设置大小:

//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);
            }
        };
Run Code Online (Sandbox Code Playgroud)

但这只适用于我自己知道尺寸的情况.在字体的情况下,我不知道没有Graphics对象的尺寸.

那么如何在字体的情况下确定大小?

Mad*_*mer 5

之所以说JLabel(和其它组件)可以生成你所看到的结果,是因为他们提供了有用的大小提示回父容器,这是使用它的布局管理器就如何最好地布局子组件的决定.

使用所有这些信息pack来确定调用窗口时制作窗口的最佳大小.

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

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


tra*_*god 5

我不想延长JLabel.

如果你不希望扩展JLabel,你可以垫封闭Container,如图所示这里使用EmptyBorder.