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

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

但是,如何为我的特定JButton组件设置正确的xywidthheight值。 从同一个方法的侧面再次调用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

除此之外, getPreferredSizesetPreferredSize方法在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个按钮上执行此操作,使用不需要的代码使您的构造函数混乱。