2010-02-14 5 views
5

J'ai utilisé une Anon classe interne pour obtenir un bouton obj:classes internes anonymes pour les boutons

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 
    } 
}); 

Je veux l'utiliser dans une taille arbitraire GWT FlexTable (qui est essentiellement une auto table de redimensionnement).

si je fais quelque chose comme ceci:

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

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

Le bouton montre que pour celui-ci un (car il n'y a qu'une seule instance). Puisque le tableau ci-dessus sera peuplé par programme, il n'est pas vraiment pratique de définir un nouveau bouton pour chaque instance possible.

J'ai essayé ce qui suit:

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 
    } 
}); 
); 

Cependant, cela ne compilera pas du tout (le premier, je suppose), je suis un peu perdu - comment puis-je réaliser cet effet?

Merci

+1

Je crois que le dernier extrait sera compilé si vous supprimez le dernier ');' – MatrixFrog

Répondre

1

Votre syntaxe est incorrecte dans le troisième exemple, mais en tout cas, en utilisant une classe anonyme dans ce cas est impossible. Vous essayez d'appeler addClickHandler sur l'objet nouvellement instancié, qui n'est stocké dans aucune variable. Théoriquement, vous pourriez mettre ce code dans un constructeur pour votre classe anonyme et appeler cette fonction sur "this". Le problème est que, à cause des particularités de la syntaxe de classe anonyme de Java (absolument atroce), il est impossible de définir un constructeur (que serait-il appelé?). Je ne suis pas sûr à 100% que je comprends ce que vous essayez d'accomplir, mais pourriez-vous définir une fonction qui vient de renvoyer une nouvelle instance de bouton correctement configurée chaque fois que vous l'appelez? Par exemple,

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; 
} 

Ensuite, vous appelez

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

+1 Il est également possible d'étendre 'Button' et d'implémenter' ClickHandler'. – trashgod

+0

merci! cela marche. trashgod, je ne suis pas sûr que je suis complètement - voulez-vous dire que je devrais définir une classe et juste en créer (anon?) des instances, dans le setWidget? – malangi

+0

Non, je pense qu'il voulait dire qu'il créait une nouvelle classe (peut être privé, paquet/défaut, interne - dépend de la portée dans laquelle vous voulez l'utiliser): 'MyButton extends Button implémente ClickHandler', puis implémente et définit le 'ClickHandler' juste comme dans ma réponse - la grande différence est que vous n'avez pas vraiment besoin d'étendre' Button' (et il est réellement découragé) - puisque vous n'introduisez aucun autre comportement personnalisé, vous voulez juste passer un commun 'ClickHandler' à beaucoup de' Button's. –

0

La façon la plus efficace (aussi bien du point de vue de GWT de et la quantité de code) est pour votre classe pour implémenter ClickHandler puis pour chaque ligne créer une nouvelle Button (vous ne pouvez pas ajouter le même Widget deux fois au 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 
    } 

} 

Notez ce que nous faisons ici - il n'y a pas de classes anonymes, nous implémentons une fois l'interface ClickHandler. Ceci est plus efficace que de créer une classe anonyme pour chaque bouton (quand vous voulez que tous les boutons se comportent de la même manière), sinon GWT devrait créer du code supplémentaire pour chaque bouton que vous ajoutez - à la place, le ClickHandler est implémenté en un seul endroit et référencé par tous les boutons. PS: Peut-être que vous devriez envisager d'utiliser un IDE comme Eclipse (avec le Google Plugin for Eclipse) - il rend le développement GWT un jeu d'enfant et attraperait des erreurs de syntaxe comme celle de votre dernier extrait de code.

+0

Merci pour cela - je suppose que l'éclipse ressemble à la voie à suivre. Je veux utiliser ces boutons dans une boucle, donc je suppose que les définir individuellement ne semble pas vraiment pratique, mais je vois votre point sur le clickhandler, cela devrait rendre le code beaucoup plus propre. Merci! – malangi

Questions connexes