2009-06-09 5 views
0

salut j'utilise swing et dans mon cadre principal (JFrame) je veux que lorsque jamais l'utilisateur appuyez sur + touche une fenêtre laisse dire que le test devrait apparaître. mon écouteur de touches fonctionne correctement si je n'appelle pas la méthode show du JInternalFrame nouvellement ajouté mais quand j'appelle la méthode show de mon JInternalFrame, le KeyListener cesse d'écouter.Problème avec keylistener

J'ai beaucoup essayé de le résoudre, mais en vain, toute aide à cet égard sera appréciée. merci.

ceci est mon keyListener

_mainFrameKeyListener = new KeyListener() 
    { 
     public void keyPressed(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
      System.out.println("the key pressed Id is : " + arg0.getKeyCode()); 

      if(arg0.getKeyCode() == 107){ 
       test Test = new test(); 
       _mainDesktopPane.add(Test); 
       Test.show(); 

      } 
     } 
     public void keyReleased(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
     } 

     public void keyTyped(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
     }   
}; 
+5

test Test = nouveau test(); - J'ai fait grincer des dents :) – willcodejavaforfood

+3

http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html – willcodejavaforfood

+1

Donc, ça marche une fois, mais quand le cadre interne est affiché, il s'arrête? Est-ce parce que le cadre interne juste ouvert a peut-être l'accent? – willcodejavaforfood

Répondre

3

Sons comme vous voulez une touche de raccourci au lieu d'un écouteur de touche pour éviter les problèmes de mise au point.

// Get the KeyStroke for our hot key 

KeyStroke plus = KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, 0, true); 

// Get the input map for our component 
// In this case we are interested in key strokes in the focussed window 

InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

// Map the key stroke to our "action key" (see below) 

inputMap.put(plus, "my_action"); 

// Get the action map for our component 

ActionMap actionMap = panel.getActionMap(); 

// Add the required action listener to out action map 

actionMap.put("my_action", actionListener); 

http://helpdesk.objects.com.au/java/how-to-specify-a-hot-key-for-a-swing-application

+0

Que diriez-vous d'une réponse, plutôt que d'un lien? –

+0

le lien contient le code d'exemple qui montre comment faire ce que j'ai suggéré, à savoir. ajoutez un hot ket au lieu d'utiliser une touche d'écoute – objects

+0

merci pour votre réponse HotKey fonctionne selon mes attentes. – gopal

1

Vous devez ajouter l'écouteur de touche exactement le composant qui a le focus (de nombreux composants sont composites en fait). Par conséquent, utilisez JComponent.registerKeyboardAction avec la condition WHEN_IN_FOCUSED_WINDOW. Vous pouvez également utiliser JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW, true) et JComponent.getActionMap(true) comme décrit dans les documents API registerKeyboardAction.

+0

merci pour votre réponse Tom le problème est résolu. – gopal

0

Veuillez vérifier si une exception d'exécution est levée. peut-être êtes-vous dans le mauvais fil pour montrer cette boîte de dialogue ou un autre problème pourrait jeter cette exception.

Pensez également à utiliser un thread asynch pour afficher votre boîte de dialogue au lieu d'utiliser le thread d'écoute. Mais c'est juste une réflexion.

+0

Je n'ai pas eu votre réponse! je traitais avec l'événement de presse Key pas de problème multi-threading. et de toute façon le problème est résolu. – gopal