如果我想创建自己的自定义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);
}
}
答案 0 :(得分:3)
首先:在@Override
方法中添加setPrefferedSize
注释会明确表示应该将其称为setPreferredSize
。
除此之外,getPreferredSize
和setPreferredSize
方法在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个按钮上执行此操作,使用不需要的代码使您的构造函数变得混乱。