2009-06-09 3 views
0

Hallo ich benutze Swing und in meinem Hauptrahmen (JFrame) möchte ich, dass wenn jemals Benutzer drücken + Taste ein Fenster lässt sagen Test sollte erscheinen. Mein Key-Listener funktioniert einwandfrei, wenn ich die show-Methode des neu hinzugefügten JInternalFrame nicht anrufe, aber wenn ich die show-Methode meines JInternalFrame aufruft, hört der KeyListener nicht mehr zu.Problem mit Keylistener

Ich habe viel versucht, es zu lösen, aber alles umsonst, so dass jede Hilfe in diesem Zusammenhang geschätzt wird. danke.

das ist mein 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 = neuer Test(); - machte mich zusammenzucken :) – willcodejavaforfood

+3

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

+1

So funktioniert es einmal, aber wenn der interne Rahmen angezeigt wird, stoppt es? Liegt es daran, dass der gerade geöffnete interne Frame den Fokus hat? – willcodejavaforfood

Antwort

3

Klingt wie Sie einen Hotkey statt eines Schlüssels Hörer Probleme zu vermeiden Fokus wollen.

// 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

Wie wäre es mit einer Antwort anstatt mit einem Link? –

+0

Der Link enthält den Beispielcode, der zeigt, wie das zu tun ist, was ich vorgeschlagen habe, d. Fügen Sie einen Hot Ket hinzu, anstatt einen Key Listener zu verwenden – objects

+0

danke für Ihre Antwort HotKey funktioniert nach meinen Erwartungen. – gopal

1

Sie müssten den Schlüssel Zuhörer hinzufügen die Komponente genau, das den Fokus hat (viele Komponenten sind tatsächlich Composites).

Verwenden Sie also JComponent.registerKeyboardAction mit einem Zustand von WHEN_IN_FOCUSED_WINDOW. Alternativ verwenden Sie JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW, true) und JComponent.getActionMap(true) wie in der API-Dokumentation registerKeyboardAction beschrieben.

+0

danke für deine Antwort Tom das Problem ist gelöst. – gopal

0

Überprüfen Sie, ob eine Laufzeitausnahme ausgelöst wird. Möglicherweise sind Sie im falschen Thread zum Anzeigen dieses Dialogfelds oder ein anderes Problem könnte diese Ausnahme auslösen.

Denken Sie auch daran, einen asynchronen Thread zum Anzeigen Ihres Dialogs zu verwenden, anstatt den Listener-Thread zu verwenden. Aber das ist nur eine Überlegung.

+0

Ich habe Ihre Antwort nicht erhalten! Ich hatte mit Key-Presseereignis keine Multi Threading Problem. und sowieso Problem ist gelöst. – gopal