Java Swing - 为什么JComponent不会显示?

时间:2011-07-24 03:04:40

标签: java swing jbutton extend jcomponent

我正在尝试扩展一个类,最终制作一个自定义按钮。我在几个地方读过,最好尽可能在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)。

enter image description here

5 个答案:

答案 0 :(得分:4)

JComponent和它的子类之间的主要区别之一是后者具有UI委托,而JComponent则没有。请注意,setBackground()“颜色仅在组件不透明时使用,并且仅由JComponentComponentUI实现的子类使用。”因此,您“必须覆盖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);