2010-11-27 19 views
1

J'écris une applet et je veux comprendre comment faire un bouton et un événement clé couvre le même morceau de code. Pour cette question, je vais appeler ce bouton fireButton. Le code pour l'événement d'action serait bien sûr ressembler à ceci:Comment effectuer un ActionEvent et un KeyEvent avec la même action?

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == fireButton) { 
     //all the code that pressing button executes 
    } 
} 

Maintenant, je veux appuyer sur la touche « Entrée » pour exécuter le même code que l'événement d'action traite, mais je ne veux pas réécrire tous les code à nouveau dans une méthode keyPressed. Pour être précis, j'écris un programme de cuirassé, et le bouton 'Fire' prend l'entrée de deux textFields, gère les exceptions, et passe l'entrée en tant que paramètres à une méthode qui se déclenche à un carré particulier dans la grille. Idéalement, appuyer sur la touche Entrée fonctionnerait de la même manière que si j'avais appuyé sur le bouton de tir. Existe-t-il un moyen de faire appeler une certaine méthode une méthode actionPerformed? Sinon, quelle serait une solution élégante au problème?

Répondre

1
  1. Créer une action
  2. Ajouter l'action à la DButton
  3. Utilisez la clé pour lier Manchettes la touche Entrée pour l'action

Lire la Swing tutorial. Il y a des sections sur:

  1. Comment utiliser les actions
  2. Comment utiliser Manchettes Key

Si vous parlez à peu près appeler le bouton « Fire » avec la touche entrée puis vérifier Enter Key and Button pour quelques approches.

+0

le dernier lien était exactement ce dont j'avais besoin. Merci! – meerkat

0

Empruntant de MVC Je vous recommande d'avoir une classe de contrôleur qui gère ces sortes de demandes. Ensuite, tout ce que vous avez à faire est de déléguer au contrôleur dans chaque gestionnaire d'événement.

Comme si:

public class BattleShipController { 

    public void handleFireAction() { 
    // ... 
    } 
} 

//-- in your UI class(es) 
private BattleShipController _controller = new BattleShipController(); 

//-- in event calls: 
_controller.handleFireAction(); 

Si vous postez code approprié que je peux faire d'autres suggestions.

1

Je vous suggère de mettre tout le code dans une méthode distincte qui reçoit toutes les données pertinentes de l'événement (le cas échéant) en tant que paramètres:

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == fireButton) { 
     Object relevantData0 = new Object(); // e.getSomething(); 
     Object relevantData1 = new Object(); // e.getSomethingElse(); 
     handleFireAction(relevantData1, relevantData2); 
    } 
} 

public void actionPerformed(KeyEvent e) { 
    if (e.getSource() == fireButton) { 
     Object relevantData0 = new Object(); // e.getSomething(); 
     Object relevantData1 = new Object(); // e.getSomethingElse(); 
     handleFireAction(relevantData1, relevantData2); 
    } 
} 

private void handleFireAction(Object relevantData0, Object relevantData1) { // Object relevantDat2, and so on 
    //all the code that pressing button executes 
} 

Si vous ne avez pas besoin de données de l'événement son encore plus facile;) De cette façon, vous écrivez simplement votre code une fois pour les deux événements. C'est une approche générale OO.
Espérons que cela aide.