我自己的JButton首选大小无法正常工作?

时间:2014-05-06 17:58:25

标签: java swing jbutton

如果我想创建自己的自定义JButton,我想设置首选大小,我该怎么做呢。我认为它可能很容易但是当我到达它时,我有一个尺寸,我将发送到我的首选尺寸。

但是,如何为我设置正确的 x y 宽度高度值特定的JButton组件。从同一方法的方面再次调用setPreferredSize似乎是多余的?

对于覆盖JComponent,我觉得奇怪。我知道他们应该如何使用paintComponent(...)

我希望我的新按钮具有首选大小(这是默认大小)20 x 20

我想在任何按钮上设置它,但是构造函数没有设置大小。

创建自定义按钮时应该覆盖哪些方法?

class myButton extends JButton {
    public myButton(String s) {
        super(s);   
    }
    public void setPrefferedSize(Dimension d) {
        this.setBounds(x, y, width, height)
        setPreferredSize(d);
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.RED);
    }
}

4 个答案:

答案 0 :(得分:3)

首先:在@Override方法中添加setPrefferedSize注释会明确表示应该将其称为setPreferredSize

除此之外,getPreferredSizesetPreferredSize方法在JComponent中有一些特殊的语义。引自JComponent#getPreferredSize文档:

  

如果preferredSize已设置为非null值,则返回该值。如果UI委托的getPreferredSize方法返回非null值,则返回该值;否则,请遵从组件的布局管理器。

使用setPreferredSize设置首选尺寸时,一切都很好。 (我建议创建组件的子类只是为了在构造函数中调用一些set...方法,但我假设您将有一些其他方法可以证明扩展类)。

但是,当覆盖getPreferredSize的{​​{1}}时,应该尝试保留此方法的语义。这意味着你应该像那样覆盖它

JComponent

(实际上,人们必须首先向UI询问首选大小,但这可能不是这里所希望的)

答案 1 :(得分:2)

在重写的super.setPreferredSize(d);方法中调用setPrefferedSize(),否则会导致StackOverflowError一次又一次地调用相同的方法。


尝试使用覆盖getPreferredSize()类的自定义JButton方法。

@Override
public Dimension getPreferredSize() {
    return new Dimension(50, 20);
}

答案 2 :(得分:2)

尝试重写getMaximumSize和getMinimumSize。使用哪个值以及如何使用它们取决于布局(及其实现)。如果布局没有行为,设置所有三个(最小,最大,首选)应该会给你一个确定的大小。

答案 3 :(得分:1)

这真的很简单。

public class MyButton extends JButton {

    public MyButton(String s) {
        super(s);
        this.setPreferredSize(new Dimension(20, 14));
        this.setBackground(Color.black);
        this.setFont( new Font("Verdana", Font.BOLD, 10));
        this.setForeground(Color.WHITE);
    }
}

使用这些方法设置预定义的东西并不是多余的,这是你应该如何做到的。多余的是在程序中的24个按钮上执行此操作,使用不需要的代码使您的构造函数变得混乱。