2010-01-25 18 views
17

Ich habe eine JPanel innerhalb einer JFrame. Ich habe eine KeyListener registriert, auf der ich die JPanel aktualisieren möchte. Das Problem, das ich habe, ist, dass ich nicht den Fokus auf die JPanel bekommen kann und daher meine KeyListener wird nicht funktionieren. Ich weiß bereits, dass die KeyListener ist funktional, weil ich es mit der JFrame registriert und es hat gut funktioniert. Mein Code sieht im Moment so aus:Erhalten Fokus auf ein JPanel

myFrame.setFocusable(false); 
myPanel.setFocusable(true); 
myPanel.addKeyListener(myKL); 
myFrame.add(myPanel); 

Hat jemand schon einmal ein solches Problem festgestellt? Gibt es etwas, das mir diesbezüglich fehlt?

S.S .: Ich habe keine Komponenten innerhalb der JPanel Ich zeichne nur ein Bild auf dem Hintergrund, so muss ich den Fokus auf das JPanel selbst und nicht auf etwas darin.

+1

Hmm, mit dem Hinzufügen von myPanel.requestFocus() das für mich arbeitet. Welche Java-Version verwenden Sie? –

+1

Vielleicht post ein SSCCE (einfaches in sich geschlossenes kompilierbares Beispiel), das dies reproduziert. Das wird anderen etwas zum Arbeiten geben und ihnen helfen. Ich habe auch ein Problem festgestellt, indem ich es auf den kleinsten Bereich beschränke, manchmal finde ich selbst die Lösung. – broschb

Antwort

21

Obwohl Sie angeben, dass das Panel fokussierbar sein kann, fragt das Panel nicht nach dem Fokus. Versuchen Sie es mit myPanel.requestFocus();.

+0

Danke für Ihre Antwort. Versucht sowohl requestFocus() als auch requestFocusInWindow(), keiner von ihnen lässt das Panel den Fokus bekommen. Hast du noch andere Vorschläge? –

+1

Es kann davon abhängen, wann Sie es anrufen. Nennen Sie es zum Beispiel nicht im JPanel-Konstruktor, da dieser aufgerufen wird, bevor das Panel angezeigt wird. –

+0

Danke David, diese Antwort hat bei mir funktioniert, ich hatte keine Ahnung, dass ich den Aufruf vom Konstruktor nicht machen konnte. Sobald ich requestFocus() in eine Methode verschoben habe, die nach der Anzeige auf dem Bildschirm aufgerufen wurde, funktionierte es einwandfrei. –

1

Ich habe manchmal ein ähnliches Problem. Ich habe festgestellt, dass es in einigen Fällen besser ist, einen Fokus auf ein bestimmtes Steuerelement innerhalb des Bereichs innerhalb des Rahmens zu setzen oder anzufordern (z. B. das Eingabefeld, in das die Tastatureingabe gehen soll), anstatt den Fokus für den Bereich anzufordern Fenster selbst

+0

völlig einverstanden. –

1

Versuchen

panel.setFocusable(true); 
panel.setRequestFocusEnabled(true); 

// some code here 

panel.grabFocus(); 
6

Verwenden setFocusable(true) und dann requestFocusInWindow(). Aber letzteres muss getan werden nach das Fenster mit dem Panel sichtbar gemacht wird, für die Sie wahrscheinlich einen Fenster-Listener registrieren müssen und den requestFocusInWindow() im Fenster aktivierten Handler-Code tun.

Hinweis: Insbesondere nach dem Fenster ist sichtbar, nicht nur nach setVisible(true) Aufruf.

1

so etwas wie dieses Versuchen:

myFrame.addFocusListener(new FocusAdapter() { 

     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public void focusGained(FocusEvent aE) { 
      myPanel.requestFocusInWindow(); 
     } 
    });