1

在下面的代码中,仅JFrame包含JLabelBorderLayout.

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?

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

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

4

2 回答 2

5

我不想延长JLabel

如果您不想扩展JLabel,可以填充封闭,如此Container所示使用.EmptyBorder

于 2013-10-07T20:25:47.953 回答
5

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

当您调用它时,所有这些信息都用于pack确定制作窗口的最佳尺寸。

默认情况下 aJComponent的首选大小是 0x0,这对您不是很有帮助。首先覆盖 componentsgetPreferredSize方法并返回,例如,new Dimension(200, 200);

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

于 2013-10-07T20:12:33.523 回答