2009-09-15 1 views
32

Я создал одну форму с помощью Swing в Java. В форме я использовал одно текстовое поле, на котором я должен установить фокус всякий раз, когда я нажимаю клавишу. Как настроить фокус на конкретном компоненте Java?Как вы фокусируетесь на текстовом поле в Swing?

+1

10 вопросов, принято ни один из них ответы ... –

ответ

73

Может ли Component.requestFocus() предоставить вам то, что вам нужно?

+0

Спасибо, позвольте мне посмотреть, работает ли это для меня или нет. –

+8

Принял меня на пять минут, чтобы найти его ... так много для «простого» поиска :-(- хорошо, документы API Java API не являются образцом ясности в любом случае :-) – Joey

+3

FYI, [javadocs для JComponent] (http://docs.oracle.com/javase/7/docs/api/index.html) говорят о 'requestFocus()', "использовании этого метод обескуражен, потому что его поведение зависит от платформы. мы рекомендуем использовать [requestFocusInWindow()] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocusInWindow()). Если вам нужна дополнительная информация о фокусе, см. [Как использовать подсистему фокуса] (http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html), раздел в учебнике по Java . » –

13

Теперь, когда мы искали API, все, что нам нужно сделать, это прочитать API.

Согласно документации API:

"Поскольку поведение фокус этого метода зависит от платформы, разработчики настоятельно рекомендуется использование requestFocusInWindow когда возможно."

21

Это будет работать.

SwingUtilities.invokeLater(new Runnable() { 

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

Обратите внимание, что все вышеперечисленное не работает по какой-либо причине на JOptionPane. После долгих проб и ошибок (более вышеуказанных 5 минут, во всяком случае), вот что, наконец, работал:

 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

благодарю вас за это решение. он работал. – MyPasswordIsLasercats

3

Вы также можете использовать JComponent.grabFocus(); это те же

+0

Javadoc для [JComponent.grabFocus()] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#grabFocus--) явно заявляет, что этот метод должен не используется клиентским кодом и предлагает использовать метод 'requestFocusInWindow()', о котором уже упоминалось в других ответах. –