Java Swing - Почему JComponent не отображается? - PullRequest
1 голос
/ 24 июля 2011

Я пытаюсь расширить класс, чтобы в конечном итоге сделать пользовательскую кнопку.Я читал в нескольких местах, что лучше всего расширить как можно выше на иерархии (для лучшего полиморфизма?), Поэтому я пытаюсь расширить 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 ]

4 голосов
/ 24 июля 2011

Одним из основных отличий между JComponent и его подклассами является то, что у последних есть делегаты пользовательского интерфейса, а у JComponent нет.Обратите внимание, что цвет setBackground() "используется только в том случае, если компонент непрозрачен, и только подклассами реализаций JComponent или ComponentUI."В результате вы «должны переопределить paintComponent(), чтобы соблюдать это свойство.»

3 голосов
/ 24 июля 2011

Вам все еще нужно расширить JButton, если вы хотите JButton функциональность. В противном случае каждый может расширить Object и ожидать всего.

3 голосов
/ 24 июля 2011

Что вы ожидаете увидеть в том месте, где должен быть JComponent?когда вы расширяете JButton, вы получаете всю его графику, но вы создали пустой компонент, в котором ничего нет.Попробуйте вставить что-то в компонент (например, JLabel или аналогичный)

2 голосов
/ 24 июля 2011

Это пустой компонент (в основном шаблон).У него нет свойств.Вы должны добавить свои собственные графические элементы, переопределив метод paintComponent, а затем добавить логические элементы, переопределив метод update.

0 голосов
/ 16 мая 2016

Либо используйте JButton как есть:

 JButton b1 = new JButton("Enter JButton text here");     
 basePanel.add(b1,gbc); 

или расширьте класс JButton, если вы хотите изменить определенные свойства и настроить его для своих собственных предпочтений:

public class TestButton extends JButton {
    private static final long serialVersionUID = 1L;


    public TestButton(String buttonText) 
    {
        super(buttonText);        
    }

}
...