2009-09-15 18 views
32

Ho creato un modulo utilizzando Swing in Java.Nella forma ho usato un campo di testo su cui devo impostare lo stato attivo ogni volta che premo il tasto. Come impostare lo stato attivo su un particolare componente in Java?Come si imposta lo stato attivo su Textfield in Swing?

+1

10 domande, nessuno di loro risposte accettate ... –

risposta

73

Component.requestFocus() ti darebbe quello che ti serve?

+0

Grazie, vediamo se funziona per me o meno –

+8

Mi ci sono voluti cinque minuti per trovarlo ... così tanto per la ricerca "semplice" :-(- ah beh, i documenti API Java non sono un paragone di chiarezza comunque :-) – Joey

+3

FYI, il [javadocs per JComponent] (http://docs.oracle.com/javase/7/docs/api/index.html) dice di 'requestFocus()', "uso di questo il metodo è sconsigliato perché il suo comportamento dipende dalla piattaforma raccomandiamo l'uso di [requestFocusInWindow()] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocusInWindow()). Per ulteriori informazioni sulla messa a fuoco, vedere [Come utilizzare il sottosistema Focus] (http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html), una sezione in The Java Tutorial . " –

13

Ora che abbiamo cercato l'API, tutto ciò che dobbiamo fare è leggere l'API.

Secondo la documentazione API:

"Poiché il comportamento focus di questo metodo dipende dalla piattaforma, sviluppatori sono fortemente incoraggiati a uso requestFocusInWindow quando possibile".

21

Questo funzionerebbe ..

SwingUtilities.invokeLater(new Runnable() { 

public void run() { 
     Component.requestFocus(); 
    } 
}); 
3

Si noti che tutto ciò non riesce per qualche motivo in un JOptionPane. Dopo molti tentativi ed errori (più di quanto sopra indicati 5 minuti, in ogni caso), qui è quello che alla fine ha funzionato:

 final JTextField usernameField = new JTextField(); 
// ... 
     usernameField.addAncestorListener(new RequestFocusListener()); 
     JOptionPane.showOptionDialog(this, panel, "Credentials", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); 


public class RequestFocusListener implements AncestorListener { 
    @Override 
    public void ancestorAdded(final AncestorEvent e) { 
     final AncestorListener al = this; 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final JComponent component = e.getComponent(); 
       component.requestFocusInWindow(); 
       component.removeAncestorListener(al); 
      } 
     }); 
    } 

    @Override 
    public void ancestorMoved(final AncestorEvent e) { 
    } 

    @Override 
    public void ancestorRemoved(final AncestorEvent e) { 
    } 
} 
+1

grazie per questa soluzione. Questo è l'unico modo – MyPasswordIsLasercats

3

Si può usare anche JComponent.grabFocus(); è lo stesso

+0

Javadoc per [JComponent.grabFocus()] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#grabFocus--) afferma esplicitamente che questo metodo dovrebbe non può essere utilizzato dal codice client e suggerisce di utilizzare il metodo 'requestFocusInWindow()', che è già menzionato in altre risposte. –

Problemi correlati