(nidificate?) classi interne anonime per i pulsanti
-
20-09-2019 - |
Domanda
Ho usato una classe interna anon per ottenere un pulsante obj:
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
}
});
Voglio usarlo in una GWT FlexTable di dimensioni arbitrarie (che è fondamentalmente una tabella di ridimensionamento automatico).
se faccio qualcosa del genere:
currentTable.setText(3, 0, "elec3");
currentTable.setWidget(3, 2, modButton);
currentTable.setText(4, 0, "elec4");
currentTable.setWidget(4, 2, modButton);
Il pulsante viene visualizzato solo per quest'ultimo (poiché esiste una sola istanza).Poiché la tabella precedente verrà popolata in modo programmatico, non è realmente pratico definire un nuovo pulsante per ogni possibile istanza.
Ho provato questo quanto segue:
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
}
});
);
Tuttavia, questo non verrà compilato affatto (il primo;Immagino), sono un po' perso: come posso ottenere questo effetto?
Grazie
Soluzione
La tua sintassi non è corretta nel terzo esempio, ma in ogni caso è impossibile utilizzare una classe anonima in quel caso.Stai tentando di chiamare addClickHandler sull'oggetto appena istanziato, che non è memorizzato in nessuna variabile.In teoria, potresti inserire quel codice in un costruttore per la tua classe anonima e chiamare quella funzione su "questo".Il problema è che, a causa delle peculiarità della sintassi delle classi anonime (assolutamente atroci) di Java, è impossibile definire un costruttore (come si chiamerebbe?).
Non sono sicuro al 100% di capire cosa stai cercando di realizzare, ma potresti definire una funzione che restituisca semplicemente una nuova istanza di pulsante configurata correttamente ogni volta che la chiami?Per esempio,
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;
}
Allora chiameresti
currentTable.setWidget(4, 2, newModButton());
Altri suggerimenti
Il modo più efficiente (sia dal punto di vista di GWT e di quantità di codice) è per la classe per implementare ClickHandler
e poi per ogni riga creare un nuovo Button
( non può aggiungere lo stesso Widget
due volte al 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
}
}
Si noti che cosa stiamo facendo qui - non ci sono classi anonime, implementiamo l'interfaccia clickHandler una volta. Questo è più efficiente rispetto alla creazione di una classe anonima per ogni tasto (quando si desidera che tutti i pulsanti si comportino allo stesso modo), perché altrimenti GWT dovrebbe creare codice aggiuntivo per ogni tasto si aggiunge - invece, clickHandler è implementato in un unico luogo e fa riferimento tutti i pulsanti.
PS: Forse si dovrebbe considerare l'utilizzo di un IDE come Eclipse (con la Google Plugin per Eclipse ) -. rende lo sviluppo GWT un gioco da ragazzi e avrebbe raggiunto gli errori di sintassi come quella nel tuo ultimo frammento di codice