2009-09-15 13 views
32

Mam utworzony jeden formularz za pomocą Swing w Javie. W formularzu użyłem jednego pola tekstowego, na którym muszę ustawić fokus za każdym naciśnięciem klawisza. Jak ustawić fokus na konkretnym komponencie w Javie?Jak ustawić fokus na Textfield w Swing?

+1

10 pytań, przyjęty żaden z nich odpowiedzi ... –

Odpowiedz

73

Czy Component.requestFocus() dałoby ci to, czego potrzebujesz?

+0

Dzięki, pozwól mi sprawdzić, czy to działa dla mnie czy nie –

+8

Zajęło mi pięć minut, aby znaleźć ... tyle dla "prostego" wyszukiwania :-(- no cóż, dokumenty Java API nie są wzorem jasności i tak :-) – Joey

+3

FYI, [javadocs for JComponent] (http://docs.oracle.com/javase/7/docs/api/index.html) mówią o 'requestFocus()', "użycie tego metoda jest odradzana, ponieważ jej zachowanie zależy od platformy zalecamy użycie [requestFocusInWindow()] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocusInWindow()). Jeśli chcesz uzyskać więcej informacji na temat fokusu, zobacz [Jak korzystać z podsystemu fokusowego] (http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html), sekcja w Poradniku Java " –

13

Po przeszukaniu interfejsu API wszystko, co musimy zrobić, to przeczytać API.

Zgodnie z dokumentacją API:

"Ponieważ zachowanie ostrości tej metody jest zależne od platformy, deweloperów zachęca się do użytku requestFocusInWindow gdy możliwe".

21

To zadziała ..

SwingUtilities.invokeLater(new Runnable() { 

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

Należy zauważyć, że wszystkie powyższe opcje z jakiegoś powodu nie udają się w JOptionPane. Po wielu prób i błędów (więcej niż wyżej podanych 5 minut, w każdym razie), tutaj jest to, co w końcu pracował:

 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

dziękuję za to rozwiązanie. To jedyny sposób zadziałało. – MyPasswordIsLasercats

3

Można użyć także JComponent.grabFocus(); to te same

+0

Javadoc dla [JComponent.grabFocus()] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#grabFocus--) wyraźnie stwierdza, że ​​ta metoda powinna nie może być użyty przez kod klienta i sugeruje użycie metody 'requestFocusInWindow()', o której już wspominano w innych odpowiedziach. –

Powiązane problemy