Когда суперкласс расширяет JFrame

Я пытаюсь использовать класс, который расширяет JFrame для создания графического интерфейса.

пример: класс Deck расширяет JFrame

Графический интерфейс встроен в его конструктор.

Теперь, когда я расширяю колоду из другого класса,

пример: класс Pile расширяет колоду

Новые окна создаются всякий раз, когда запускается экземпляр подкласса (Pile).

Это происходит потому, что подкласс наследует конструктор суперкласса и, следовательно, создает другое окно?

Можно ли этого избежать, не изменяя суперкласс Deck?

Спасибо.


person Kari    schedule 30.12.2009    source источник
comment
Создание подклассов без необходимости (почти всегда в случае JFrame и JPanel) обычно является плохой идеей.   -  person Tom Hawtin - tackline    schedule 30.12.2009
comment
Если это вызывает проблемы, вам нужно переосмыслить, действительно ли Deck нужно расширять JFrame, и ответ, вероятно, будет заключаться в том, что он не будет   -  person willcodejavaforfood    schedule 31.12.2009


Ответы (4)


Это происходит потому, что подкласс наследует конструктор суперкласса и, следовательно, создает другое окно?

Да. Вы расширяете JFrame, поэтому получаете JFrame.

super() всегда вызывается неявно перед вашим собственным конструктором, если вы сами не вызываете super(...) или this(...). Это должен быть первый вызов в вашем собственном конструкторе.

Если вам действительно нужно такое поведение, вы можете написать еще один конструктор в своем базовом классе (Deck) следующим образом:

public class Deck extends JFrame {
    public Deck(boolean createContent) {
        if( createContent ) {
            getContentPane().add(...);
            // ...
        }
    }

    public Deck() {
        this(true);
    }
}


public class Pile extends Deck {
    public Deck() {
        super(false);
        // ...
    }
}

Вы все равно получите JFrame, так как вы его расширяете, но дочерние компоненты вашего Deck-класса не создаются.

Я не уверен, почему вы хотите это сделать, поэтому, возможно, вы можете добавить больше информации для уточнения.

person Peter Lang    schedule 30.12.2009
comment
Спасибо, я попробую это. По сути, я хочу использовать компоненты графического интерфейса, созданные в Deck, из других классов. На данный момент я работаю над этим, делая эти переменные компонентов статическими и получая к ним доступ из других классов, например, с помощью Deck.JPanel1. Но я думаю, что есть лучшие способы сделать это... - person Kari; 30.12.2009

Нет. Всегда вызывается суперконструктор.

Но поскольку вы расширяете JFrame, какой смысл не создавать окно? Вы можете скрыть это, используя setVisible(false) в конструкторе Pile, но это было бы странно.

Вам следует переопределить иерархию наследования.

person Bozho    schedule 30.12.2009
comment
можно ли переопределить конструктор суперкласса? - person Kari; 30.12.2009
comment
@Kari: Нет. Суперконструктор будет вызываться неявно до вызова вашего конструктора. Предоставьте дополнительную информацию о том, почему вы хотите расширить класс, но не использовать его поведение. - person Peter Lang; 30.12.2009

Это происходит потому, что подкласс наследует конструктор суперкласса. В любом подклассе всегда вызывается первый конструктор суперкласса.

person giri    schedule 30.12.2009

Единственный способ сделать то, что вы хотите, это отредактировать класс Deck.

Простой способ сделать это - просто создать новый метод в вашем суперклассе (init()) или что-то в этом роде и поместить туда весь ваш код вместо вашего конструктора. Затем перезапишите метод init() в вашем подклассе пустым методом (или вашим собственным).

Или вы можете создать новый конструктор в своем суперклассе с параметром, например yourConstructor(boolean doNothing). Затем вы вызываете этот конструктор в своем подклассе, чтобы он выполнял только его, а не конструктор по умолчанию.

person Charnia    schedule 20.01.2012