2010-06-15 4 views
21

Comment procéder pour écrire un constructeur pour une classe interne qui implémente une interface? Je sais que je pourrais faire une nouvelle classe, mais je figure il doit y avoir un moyen de faire quelque chose le long de la ligne de celle-ci:Constructeurs dans les classes internes (implémentation des interfaces)

JButton b = new JButton(new AbstractAction() { 

    public AbstractAction() { 
     super("This is a button");       
    } 


    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

Quand j'entre ce qu'il ne reconnaît pas la méthode de AbstractAction en tant que constructeur (le compilateur demande le type de retour). est-ce que quelqu'un a une idée?

+6

Lorsque vous atteignez la limite de ce que les classes internes anonymes peuvent faire, il est fortement conseillé d'écrire une classe interne normale à la place. –

Répondre

35

Il suffit d'insérer les paramètres après le nom de la classe étendue:

JButton b = new JButton(new AbstractAction("This is a button") { 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

En outre, vous pouvez utiliser un bloc d'initialisation:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Write initialization code here (as if it is inside a no-arg constructor) 
     setLabel("This is a button") 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 
+0

répond parfaitement à ma question, merci! – thepandaatemyface

4

La classe résultante est pas de type AbstractAction mais de quelques-uns (anonyme, anonyme) type qui étend/implémente AbstractAction. Par conséquent, un constructeur pour cette classe anonyme devrait avoir ce nom 'inconnu', mais pas AbstractAction.

Il est comme l'extension/mise en œuvre normale: si vous définissez une class House extends Building et construire un House vous nommez le constructeur House et non Building (ou AbstractAction juste pour com revenir à la question initiale).

9

Si vous avez vraiment besoin d'un contructor pour une raison quelconque, vous pouvez utiliser un bloc d'initialisation:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

Mais vous ne pouvez pas appeler un constructeur super-classe à partir de là. Comme Itay a dit cependant, vous pouvez juste passer l'argument que vous voulez dans l'appel à nouveau.

Personnellement cependant, je crée une nouvelle classe intérieure pour cela:

private class MyAction extends AbstractAction { 

    public MyAction() { 
     super("This is a button."); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
} 

alors:

JButton b = new JButton(new MyAction()); 
1

La raison pour laquelle le compilateur se plaint est parce que vous essayez de déclarer un constructeur dans votre classe anonyme, ce qui n'est pas autorisé pour les classes anonymes. Comme d'autres l'ont dit, vous pouvez résoudre ce problème en utilisant un initialiseur d'instance ou en le convertissant en une classe non anonyme, vous pouvez donc écrire un constructeur pour cela.

Questions connexes