2010-12-11 6 views
1

J'utilise le concepteur GUI de NetBeans pour créer quelques JDialog s, que je sous-classe ensuite dans ma propre classe EditorDialog.Problème d'initialisation de classe Java

Avant d'aller plus loin, considérez cet exemple de code:

class MyDialog extends EditorDialog { 
    private Color someVariableThatTheGuiNeeds = new Color(0,50,100); 

    public MyDialog() { 
     super(true); 
    } 

    //<auto-generated> 
    private void initComponents() { //note this is private! 
     //... 
    } 
    //</auto-generated> 
} 

abstract class EditorDialog extends JDialog { 
    public EditorDialog() { 
     super(null,true); 
    } 
    public EditorDialog(boolean stuffNeedsDone) { 
     super(null,true); 
     //initComponents(); 
     doStuffAfterGuiInitialized(); 
    } 
} 

Le problème est, je ne peux pas appeler initComponents() de mon superclasse, parce qu'il est privé.

Pour contourner ce problème, j'ai essayé une solution de contournement pour les classes:

//in EditorDialog 
public EditorDialog(boolean stuffNeedsDone) { 
    super(null,true); 
    workaround(); 
    doStuffAfterGuiInitialized(); 
} 
protected abstract void workaround(); 

//in MyDialog 
@Override 
protected void workaround() { 
    initComponents(); 
} 

Et, bien sûr, cela ne fonctionne pas, parce someVariableThatTheGuiNeeds n'est pas initialisé quand initComponents() est appelé à cause de la façon dont la initialisations se produisent:

  • new MyDialog()
    • super(this)
      • EditorDialog(boolean) est appelé
        • super(null,true) est appelé, JDialog fait des choses
        • EditorDialog les variables de l » instance sont initialisés
        • workaround()
        • initComponents()
          • doSomethingWith(someVariableThatTheGuiNeeds) ->NullPointerException parce someVariableThatTheGuiNeeds n'est pas initialisé pour l'instant
    • NOWsomeVariableThatTheGuiNeeds est initialisés

Aussi, je ne peux pas créer un résumé initComponents() non-privé dans EditorDialog, parce que la visibilité lors de la substitution ne peut devenir plus publique . Alors, comment puis-je contourner ce problème, sans le rendre trop hackish?

(Si vous n'êtes pas familier avec NetBeans, je ne peut pas modifier le code généré automatiquement, et il n'y a pas d'autre choix (que je pourrais trouver) pour changer les modificateurs d'accès sur la méthode initComponents().

Répondre

1

Vos constructeurs shouldn » t appellent non private méthodes dans tous les cas. Si vous avez besoin d'initialisation pour vos boîtes de dialogue après leur création, vous pouvez créer une méthode init() qui devrait être appelé après le constructeur est terminé.

Remarque, le nom de la méthode doStuffAfterGuiInitialized() indique une Un peu d'un malentendu. L'interface graphique, ou même l'instance, n'est pas entièrement initialisé avant la fin du constructeur.

0

Ce problème est courant dans Java. L'instanciation n'est pas un ami du sous-classement. Nombreux sont ceux qui utilisent une solution indirecte: appelez une méthode init() une fois que l'objet est entièrement construit.

Ceci est souvent automatisé via une usine. Tous les cadres d'injection (comme le ressort) le font couramment.