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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top