Я создал одну форму с помощью Swing в Java. В форме я использовал одно текстовое поле, на котором мне нужно установить фокус всякий раз, когда я нажимаю клавишу. Как настроить фокус на конкретном компоненте в Java?
Как вы фокусируетесь на текстовом поле в Swing?
Ответ 1
Будет ли Component.requestFocus()
предоставить вам то, что вам нужно?
Ответ 2
Это будет работать.
SwingUtilities.invokeLater( new Runnable() {
public void run() {
Component.requestFocus();
}
} );
Ответ 3
Теперь, когда мы искали API, все, что нам нужно сделать, это прочитать API.
В соответствии с документацией API:
"Поскольку фокусное поведение этого метод зависит от платформы, разработчикам настоятельно рекомендуется использовать requestFocusInWindow, когда возможное."
Ответ 4
Обратите внимание, что все вышеперечисленное не работает по какой-либо причине в 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) {
}
}
Ответ 5
Вы также можете использовать JComponent.grabFocus();
, это то же самое