2010-01-25 10 views
17

Ho un JPanel all'interno di un JFrame. Ho registrato uno KeyListener, in base al quale voglio aggiornare lo JPanel. Il problema che sto avendo è che non riesco a concentrarmi sullo JPanel e quindi il mio KeyListener non funzionerà. So già che il KeyListener è funzionale perché l'ho registrato con lo JFrame e ha funzionato bene. Il mio codice è simile al seguente:Ottenere focus su un JPanel

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

Qualcuno ha riscontrato un problema come questo prima? C'è qualcosa che mi manca riguardo a questo?

P.S .: Non ho alcun componente all'interno dello JPanel Ho appena disegnato un'immagine sullo sfondo, quindi ho bisogno che lo stato attivo sia sullo JPanel stesso e non su qualcosa al suo interno.

+1

Hmm, con l'aggiunta di myPanel.requestFocus() questo funziona per me. Quale versione di Java stai usando? –

+1

Forse postare un SSCCE (semplice esempio compilabile autonomo) che riproduce questo. Ciò darà agli altri qualcosa su cui lavorare per aiutare. Ho anche notato un problema restringendolo al più piccolo ambito, a volte sono in grado di trovare la soluzione da solo. – broschb

risposta

21

Sebbene si sta indicando che il pannello può essere messa a fuoco, il pannello non richiede la messa a fuoco. Prova a utilizzare myPanel.requestFocus();.

+0

Grazie per la risposta. Provato sia con requestFocus() che requestFocusInWindow(), nessuno dei due fa in modo che il Pannello venga messo a fuoco. Avete altri suggerimenti? –

+1

Può dipendere da quando lo chiami. Non chiamarlo nel costruttore di JPanel, ad esempio, poiché viene chiamato prima che venga visualizzato il pannello. –

+0

Grazie David, questa risposta ha funzionato per me, non avevo idea che non potessi effettuare la chiamata dal costruttore. Non appena ho spostato requestFocus() su un metodo che è stato chiamato dopo la visualizzazione sullo schermo, ha funzionato perfettamente. –

1

A volte mi trovo ad affrontare un problema simile. Ho notato che in alcuni casi è meglio fare o richiedere la messa a fuoco su un controllo specifico all'interno del riquadro che si trova all'interno del frame (ad esempio, la casella di input a cui si desidera che l'input della tastiera vada), piuttosto che richiedere il focus per il riquadro stesso.

+0

totalmente d'accordo. –

1

Prova

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

// some code here 

panel.grabFocus(); 
6

Usa setFocusable(true) e poi requestFocusInWindow(). Ma quest'ultimo deve essere fatto dopo la finestra contenente il pannello è resa visibile, per cui è probabile che sia necessario registrare un listener di finestre e fare il requestFocusInWindow() nel codice del gestore attivato della finestra.

Nota: In particolare dopo la finestra è visibile, non solo dopo aver chiamato setVisible(true).

1

provare qualcosa di simile:

myFrame.addFocusListener(new FocusAdapter() { 

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