我自己的JButton首选大小无法正常工作?
如果我想创建自己的自定义JButton
,我想设置首选大小我该怎么做呢。 我认为它可能很容易但是当我到达它时,我有一个尺寸,我将发送到我的首选尺寸。
但是,如何为我的特定JButton
组件设置正确的x , y , width和height值。 从同一个方法的侧面再次调用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); } }
首先:在setPrefferedSize
方法中添加setPrefferedSize
注释会明确表示它应该被称为setPreferredSize
。
除此之外, getPreferredSize
和setPreferredSize
方法在JComponent
具有一些特殊语义。 引用JComponent#getPreferredSize文档:
如果preferredSize已设置为非null值,则返回它。 如果UI委托的getPreferredSize方法返回非null值,则返回该值; 否则遵从组件的布局管理器。
使用setPreferredSize
设置首选大小时,一切都很好。 (我不建议创建组件的子类只是为了在构造函数中调用一些set...
方法,但我假设你将有一些额外的方法来certificate扩展类的合理性)。
但是,当重写JComponent
getPreferredSize
时,应该尝试保留此方法的语义。 这意味着你应该像那样覆盖它
@Override public Dimension getPreferredSize() { // If the preferred size was set manually, return this // size in order to be in line with the specification // that is described in the JavaDoc if (super.isPreferredSizeSet()) { return super.getPreferredSize(); } // Otherwise, return "your" preferred size. The // DEFAULT_WIDTH and DEFAULT_HEIGHT would be 20,20 // in your case return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
(实际上,人们必须首先向UI询问首选大小,但这可能不是这里所希望的)
尝试重写getMaximumSize和getMinimumSize。 使用哪个值以及如何使用它们取决于布局(及其实现)。 如果布局没有行为错误,设置所有三个(最小,最大,首选)应该可以获得一定的大小。
调用super.setPreferredSize(d);
在重写的setPrefferedSize()
方法中,否则会导致StackOverflowError
一次又一次地调用相同的方法。
尝试使用重写的getPreferredSize()
方法为您的自定义JButton
类。
@Override public Dimension getPreferredSize() { return new Dimension(50, 20); }
这真的很简单。
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个按钮上执行此操作,使用不需要的代码使您的构造函数混乱。