2010-02-14 11 views
5

que he usado una clase interna anon para obtener un botón obj:clases internas anónimas para los botones

Button modButton = new Button("Modify"); 
modButton.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 
}); 

Quiero usar esto en un tamaño arbitrario GWT FlexTable (que es básicamente un auto tabla de redimensionamiento).

si no hago algo como esto:

currentTable.setText(3, 0, "elec3"); 
currentTable.setWidget(3, 2, modButton); 

currentTable.setText(4, 0, "elec4"); 
currentTable.setWidget(4, 2, modButton); 

El botón sólo se presenta para este último (ya que hay sólo un ejemplo). Dado que la tabla anterior se rellenará programáticamente, no es realmente práctico definir un nuevo botón para cada instancia posible.

yo probamos este el siguiente:

currentTable.setText(4, 0, "elec4"); 
currentTable.setWidget(4, 2, new Button("Modify"); 
modButton.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 
}); 
); 

Sin embargo, esto no se compilará en absoluto (la primera, supongo), estoy un poco perdido - ¿Cómo puedo lograr este efecto?

Gracias

+1

Creo que el último fragmento se compilará si elimina el último ');' – MatrixFrog

Respuesta

1

Su sintaxis es incorrecta en el tercer ejemplo, pero en cualquier caso, utilizando una clase anónima en ese caso es imposible. Está intentando llamar a addClickHandler en el objeto recién instanciado, que no está almacenado en ninguna variable. Teóricamente, podría poner ese código en un constructor para su clase anónima y llamar a esa función en "esto". El problema es que, debido a las peculiaridades de la sintaxis de clase anónima (absolutamente atroz) de Java, es imposible definir un constructor (¿cómo se llamaría?).

No estoy 100% seguro de entender lo que está tratando de lograr, pero ¿podría definir una función que acaba de devolver una nueva instancia de botón configurada correctamente cada vez que la llamó? Por ejemplo,

private Button newModButton() { 
    Button modButton = new Button("Modify"); 
    modButton.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      //TODO: link to a pop-up, and do a refresh on exit 
     } 
    }); 
    return modButton; 
} 

allí tendría que llamar

currentTable.setWidget(4, 2, newModButton()); 
+2

+1 Alternativamente, es posible extender 'Button' e implementar' ClickHandler' también. – trashgod

+0

gracias! esto funciona. Trashgod, no estoy seguro de seguirlo completamente. ¿Quiere decir que debería definir una clase y simplemente crear instancias (anon?) de ella, en el setWidget? – malangi

+0

No, creo que quiso decir que creaba una nueva clase (podría ser privada, paquete/predeterminada, interna - depende del alcance en el que desea usarla) de esta manera: 'MyButton extends Button implementa ClickHandler' y luego implementar y establecer el 'ClickHandler' al igual que en mi respuesta - la gran diferencia es que realmente no necesitas extender' Button' (y en realidad está desaconsejado), ya que no estás presentando ningún otro comportamiento personalizado, solo quieres pasar un 'ClickHandler' a muchos' Botones's. –

0

La forma más eficiente (tanto desde el punto de vista de GWT de y la cantidad de código) es para su clase para implementar ClickHandler y luego para cada fila crear una nuevaButton (que no se puede añadir la misma Widget dos veces para el DOM):

class Foo extends Composite implements ClickHandler { 

    public Foo() { 
     FlexTable currentTable = new FlexTable(); 

     Button button = new Button("Button1"); 
     // Add this class as the ClickHandler 
     button.addClickHandler(this); 
     currentTable.setText(3, 0, "elec3"); 
     currentTable.setWidget(3, 2, button); 

     button = new Button("Button2"); 
     // Add this class as the ClickHandler 
     button.addClickHandler(this); 
     currentTable.setText(4, 0, "elec4"); 
     currentTable.setWidget(4, 2, modButton); 
    } 


    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 

} 

Observe lo que estamos haciendo aquí; no hay clases anónimas, implementamos la interfaz ClickHandler una vez. Esto es más eficiente que crear una clase anónima para cada botón (cuando desea que todos los botones se comporten de la misma manera), porque de lo contrario GWT tendría que crear código adicional para cada botón que agregue; en cambio, ClickHandler se implementa en un solo lugar y referenciado por todos los botones.

PD: Tal vez deberías considerar el uso de un IDE como Eclipse (con el Google Plugin for Eclipse) - hace que el desarrollo de GWT sea fácil y detectaría errores de sintaxis como el del último fragmento de código.

+0

Gracias por esto, supongo que eclipse parece el camino a seguir. Quiero utilizar estos botones en un bucle, así que supongo que definirlos individualmente no parece realmente práctico, pero veo tu punto sobre el manipulador de clics, esto debería hacer que el código sea mucho más limpio. Gracias! – malangi

Cuestiones relacionadas