2009-07-22 8 views
1

J'écris une application pour un cours de Java. Je suis un débutant complet et je sors juste du matériel que j'ai appris du cours et du web. L'application montre un certain comportement et je ne suis pas sûr de ce qui le cause. L'application est basée sur l'interface graphique et effectue des calculs sur les entrées utilisateur. Pour la section d'écouteur d'action, j'ai un ensemble de Si des déclarations telles que: « si ce bouton faire ce si ce bouton le faire »Application Java si/recommandation de cas

en enfilade comme ça. Il semble que l'application exécute TOUTES les instructions if au lieu d'exécuter celle qui correspond au bouton pressé.

Serais-je mieux d'utiliser une structure de boîtier/commutateur pour ce genre de chose?

Je peux poster mon code si nécessaire, je suis nouveau sur ce site et je ne suis pas sûr si cette chose est acceptable.

+3

Oui, s'il vous plaît poster votre code. – William

+0

vous pouvez poster du code – Ariel

+0

Utilisez-vous else-ifs? Si non, vous devriez. – AlbertoPL

Répondre

1

Vous ne devriez probablement pas avoir un seul écouteur d'actions - en créer un distinct pour chaque contrôle aide à garder votre code plus lisible. Cependant, si vos contrôles partagent beaucoup de code (le contenu avant ou après les instructions if), il peut être logique de le faire de cette façon. Dans ce cas, il devrait être if/elseif. De plus, faire de vos écouteurs des classes à part entière (plutôt que des classes internes anonymes) peut aussi aider à réutiliser le code (le contenu de chaque instruction if va dans chaque sous-classe). Cela peut être au-delà de ce que vous avez appris jusqu'à présent.

Edit: (réponse plus directe à votre question réelle)

En ce qui concerne votre problème, le cas de ne doit pas tout exécuter à moins que la réponse soit drs9222 que dit que vous utilisiez un point-virgule à la fin de votre si est correct, ou votre instruction if teste la mauvaise chose.

Vous pouvez simplement publier ce que vous testez, mais vous devez comparer votre objet "Button" connu à event.getSource() en utilisant == ou .equals. Puisque chaque objet Button que vous comparez est différent, un seul doit être exécuté.

+0

J'ai pensé que puisque l'application était si petite, un seul auditeur serait ok. Depuis lors, il a augmenté quelque peu et je peux le faire à la fin. Dans l'esprit d'apprentissage cependant, je voudrais comprendre pourquoi mes déclarations si agissent si bizarre. Faire des sous-classes m'a aussi traversé l'esprit. Merci pour votre contribution. –

+0

+1 pour une action, un écouteur d'action. -10 pour "classes à part entière". –

+0

@tom Les classes internes anonymes ne sont pas très bonnes avec la réutilisation du code. Peu de choses ne sont pas améliorées en en faisant un cours complet et réutilisable avec les membres et tous. J'ai souvent refactorisé un peu de code écrit par des gens avec des attitudes comme ça dans une seule classe au 1/10 de la taille car ils ne considéraient jamais que les auditeurs devraient le plus souvent être des classes complètes et donc ne pouvaient pas voir le refactor et juste a fait le mauvais copier/coller/éditer/répéter le tour. –

2

Sans voir le code je ne peux pas dire avec certitude, mais quelque chose que j'ai toujours l'habitude de faire était d'utiliser if et non else if - si plusieurs de mes conditions étaient remplies, alors tout le code associé a été exécuté. Si vous souhaitez exécuter uniquement la première partie, utilisez if-else pour vous assurer qu'aucune des instructions suivantes ne sera exécutée.

+0

Le code peut être trouvé ici http://pastebin.com/m70593cb3 Il y a 3 instructions if pour un menu déroulant, et chaque bouton a sa propre instruction if, cela peut sembler plus logique si vous voyez le code. Merci pour votre avis jusqu'à présent. –

3

Jusqu'à ce que je vois votre code, je vais devoir deviner mais étant donné votre nouveauté admise que vous pouvez écrire votre si des déclarations comme celle-ci

if (condition); 
{ 
    ... 
} 

au lieu de comme celui-ci

if (condition) 
{ 
    ... 
} 
+0

J'ai vérifié deux fois que je me rends compte que cela peut causer des problèmes car j'ai déjà fait cette erreur, mais mes déclarations ne se terminent pas par un point-virgule. le code peut être trouvé ici http://pastebin.com/m70593cb3 si vous voulez prendre un pic –

+3

Après un coup d'oeil très rapide, je vois que les lignes 141, 169 et 198 ont ce problème – drs9222

+0

ahh, comment ai-je raté cela plusieurs fois ... désolé je regardais juste à nouveau dessus et je les ai vus là ... mes yeux doivent devenir paresseux;) merci –