2010-06-15 16 views
21

¿Cómo podría escribir sobre un constructor para una clase interna que está implementando una interfaz? Sé que podría hacer una clase completamente nueva, pero calculo Tiene que haber una manera de hacer algo a lo largo de la línea de esta:Constructores en clases internas (implementando interfaces)

JButton b = new JButton(new AbstractAction() { 

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


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

Cuando entro en este que no reconoce el método AbstractAction como constructor (el compilador pregunta por el tipo de devolución). ¿Alguien tiene alguna idea?

+6

Cuando llega al límite de lo que pueden hacer las clases internas anónimas, es una buena pista que debe escribir una clase interna normal en su lugar. –

Respuesta

35

basta con insertar los parámetros tras el nombre de la clase extendida:

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

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

Además, se puede usar un bloque de inicialización:

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

responde mi pregunta perfectamente, gracias! – thepandaatemyface

4

La clase resultante no es de tipo AbstractAction pero de alguna (sin nombre, anónimo) tipo que extiende/implementa AbstractAction. Por lo tanto, un constructor para esta clase anónima necesitaría tener este nombre 'desconocido', pero no AbstractAction.

Es como extensión/aplicación normales: si se define un class House extends Building y construir un House usted nombra el constructor House y no Building (o AbstractAction sólo para com Volver a la pregunta original).

9

Si realmente necesita un contructor por cualquier razón, a continuación, se puede utilizar un bloque de inicialización:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

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

pero no se puede llamar a un constructor de la superclase de allí. Sin embargo, como dijo Itay, puedes pasar el argumento que desees a la nueva llamada.

Personalmente, sin embargo, me gustaría crear una nueva clase interna para esto:

private class MyAction extends AbstractAction { 

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

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

a continuación:

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

La razón por la que el compilador se queja es porque usted está tratando de declarar un constructor dentro de su clase anónima, que no está permitida para las clases anónimas. Como han dicho otros, puede resolver esto utilizando un inicializador de instancia o convirtiéndolo en una clase no anónima, para que pueda escribirle un constructor.