我正在尝试扩展一个类,最终制作一个自定义按钮。我在几个地方读过,最好尽可能在heirarchy上扩展(为了更好的多态性?),所以我试图扩展JComponent
:
import javax.swing.*;
import java.awt.*;
public class TestButton extends JComponent {
private static final long serialVersionUID = 1L;
public TestButton() {
super();
}
}
调用它的代码是:
b1 = new TestButton();
basePanel.add(b1,gbc); // (gbc is GridBagConstraints object)
问题是,我的JComponent
未显示在我的布局中。如果我将类扩展为JButton
,则表明没有问题。这是什么交易?
更新
仅供参考,这是一个菜鸟概念问题,我显然远非精通这里。
这是一张描述的图片。唯一改变的是extends ______
。
应该发生的是紫色填充块,与底部黄色块的高度相同。
正在发生的是没有背景的默认大小的块(黑色来自JFrame)。
答案 0 :(得分:4)
JComponent
和它的子类之间的主要区别之一是后者具有UI委托,而JComponent
则没有。请注意,setBackground()
“颜色仅在组件不透明时使用,并且仅由JComponent
或ComponentUI
实现的子类使用。”因此,您“必须覆盖paintComponent()
以尊重此属性。”
答案 1 :(得分:3)
您希望在JComponent
所在的地方看到什么?当你扩展JButton
时,你会得到它的所有图形,但你创建了一个空组件,其中没有任何内容。尝试在组件中放置一些东西(例如JLabel
或类似的)
答案 2 :(得分:3)
如果您需要JButton
的功能,仍需要扩展JButton
。否则,每个人都可以延长Object
并期待一切。
答案 3 :(得分:2)
它是一个空白组件(基本上是一个模板)。它没有属性。您必须通过覆盖paintComponent方法添加自己的图形元素,然后通过覆盖update方法添加逻辑元素。
答案 4 :(得分:0)
按原样使用JButton:
<IfModule mod_headers.c>
<LocationMatch "/.well-known/acme-challenge/*">
Header set Content-Type "text/plain"
</LocationMatch>
</IfModule>
如果您希望更改某些属性并根据自己的喜好自定义它,请或扩展JButton类:
JButton b1 = new JButton("Enter JButton text here");
basePanel.add(b1,gbc);