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 chosesEditorDialog
les variables de l » instance sont initialisésworkaround()
initComponents()
doSomethingWith(someVariableThatTheGuiNeeds)
->NullPointerException parcesomeVariableThatTheGuiNeeds
n'est pas initialisé pour l'instant
- NOW
someVariableThatTheGuiNeeds
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()
.