如何在JComponent的子类中使用setPreferredSize(...)?

时间:2014-02-09 01:38:36

标签: java

我正在尝试构建我自己的JComponent,并不想开始。我可以创建一个对象,然后将其添加到JFrame或JPanel,它将添加到组件列表中。我不知道如何setPreferredSize()。

问题:如何设置setPrefferedSize(),并在创建对象的所有实例时自动将此特定大小设置为

    **@Override
    public void setPreferredSize(Dimension preferredSize) {
        super.setPreferredSize(preferredSize);
    }**

类别:

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

public class myComponent extends JComponent {
    private static final long serialVersionUID = 1L;

    public myComponent() {
        setPreferredSize(new Dimension(20,50));
        setToolTipText(new String("This is a custom buttion"));
    }

    **@Override
    public void setPreferredSize(Dimension preferredSize) {
        super.setPreferredSize(preferredSize);
    }**

    @Override
    public void setToolTipText(String text) {
        super.setToolTipText(text);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawString("I love pizza", 100, 100);
        g.drawRect(10, 10, 200, 200);
    }

    public static void main(String[] args) {
        myComponent t = new myComponent();
    }
}

1 个答案:

答案 0 :(得分:1)

致电时

setPreferredSize(new Dimension(20,50));

在构造函数中,那么类的所有实例都将具有此首选大小(当然,只要它们使用此构造函数)。

顺便说一句:覆盖一个方法而只是调用此方法的super版本并没有多大意义(只要你不增加从protectedpublic的可见性或所以...)。并且您没有调用super版本的唯一方法是您应该实际执行此操作:通常,您将paintComponent覆盖为

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

    // Your drawing here...
}

BTW2:不要使用new String("foo")。这一行

setToolTipText(new String("This is a custom buttion"));

应该是

setToolTipText("This is a custom buttion");
编辑:也许人们也应该提到这一点:"首选尺寸背后的意图"在Swing中略有不同。通常,扩展JComponent的类有一个"内在的"首选尺寸。在你的情况下,这可能是(220,220),因为你想绘制一个带有10像素边距的200x200矩形。但是,此组件的用户应该能够通过调用setPreferredSize并传入所需大小来修改此首选大小。但是当他们打电话给setPreferredSize(null)时,那就是原来的"内在的"应再次使用首选尺寸。因此,为了确保正确处理首选大小,您可以/应该实现这样的方法:

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

public class myComponent extends JComponent {
    private static final long serialVersionUID = 1L;

    public myComponent() {
        // setPreferredSize(new Dimension(20,50)); Don't call this here!
        setToolTipText(new String("This is a custom buttion"));
    }

    @Override
    public Dimension getPreferredSize() {
        if (super.isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(220,220); // or (20,50), just as you want...
    }

    ...
}