2009-12-30 10 views
0

J'essaie d'utiliser une classe qui étend JFrame pour construire une interface graphique.Quand une super-classe étend JFrame

ex: plate-forme de classe extends JFrame

L'interface graphique est construit dans son constructeur.

Maintenant, quand je pont se prolongent d'une autre classe,

ex: Pile de classe étend le pont

Les nouvelles fenêtres sont créées chaque fois qu'une instance de la sous-classe (Pile) est démarré. Est-ce parce que la sous-classe hérite du constructeur de la superclasse et crée donc une autre fenêtre?

Est-ce que cela peut être évité sans modifier la superclasse Deck?

Merci.

+1

Sous-classer inutilement (presque toujours le cas avec 'JFrame' et' JPanel') est généralement une mauvaise idée. –

+0

Si cela cause des problèmes, vous devez repenser si Deck doit vraiment étendre JFrame et la réponse sera probablement – willcodejavaforfood

Répondre

2

Est-ce qui se passe parce que la sous-classe hérite du constructeur superclasse et créant ainsi une autre fenêtre?

Oui. Vous étendez un JFrame, vous obtenez ainsi un JFrame.

super() est toujours appelée implicitement avant votre propre constructeur, sauf si vous appelez super(...) ou this(...) vous-même. Cela doit être le premier appel de votre propre constructeur.

Si vous voulez vraiment que le comportement, vous pouvez écrire un autre constructeur dans votre classe de base (Deck) comme ça:

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); 
     // ... 
    } 
} 

Vous finirez toujours avec un JFrame puisque vous prolongez, mais les composants de l'enfant de votre Deck -classe ne sont pas créés. Je ne sais pas pourquoi vous voulez faire cela, alors peut-être que vous pouvez ajouter plus d'informations à clearify.

+0

Merci. Je vais essayer. Fondamentalement, je veux utiliser les composants GUI qui sont créés dans Deck, à partir d'autres classes. Pour le moment, je travaille autour d'elle en rendant ces variables de composants statiques et en y accédant depuis les autres classes en utilisant Deck.JPanel1, par exemple. Mais je pense qu'il y a de meilleures façons de le faire ... – Kari

1

Non. Le super constructeur est toujours appelé.

Mais puisque vous étendez JFrame, quel est le point de ne pas créer une fenêtre? Vous pouvez le masquer en utilisant setVisible(false) dans le constructeur de Pile, mais ce serait étrange.

Vous devez redéfinir votre hiérarchie d'héritage.

+0

est-il possible de surcharger le constructeur de la superclasse? – Kari

+1

@Kari: Non. Le super-constructeur sera appelé implicitement avant que votre constructeur ne soit appelé. Veuillez fournir plus d'informations sur les raisons pour lesquelles vous souhaitez étendre une classe sans utiliser son comportement. –

1

Cela se passe parce que la sous-classe hérite du constructeur de super classe. Dans toute sous-classe, le premier constructeur de super classe est toujours appelé.

0

La seule façon de faire ce que vous voulez est d'éditer la classe Deck.

Un moyen facile de le faire est juste de faire une nouvelle méthode dans votre superclasse (init()) ou quelque chose, et de mettre tout votre code là-bas au lieu de votre constructeur. Remplacez ensuite la méthode init() de votre sous-classe par une méthode vide (ou la vôtre).

Ou vous pouvez créer un nouveau constructeur dans votre superclasse avec un paramètre, comme yourConstructor (boolean doNothing). Ensuite, vous appelez ce constructeur dans votre sous-classe pour qu'il n'exécute que celui-là et pas votre constructeur par défaut.