Установка фокуса на текстовое поле - PullRequest
14 голосов
/ 09 января 2011

У меня есть приложение, разработанное в NetBeans, и я хочу установить фокус на определенный jTextField, когда отображается панель.Я прочитал несколько постов и пробовал различные методы, но не сработал.Одна из основных проблем заключается в том, где разместить требуемый код, который, как мне кажется, в моем случае: this.txtMessage.requestFocusInWindow();

. Некоторые сообщения указывают на использование Window Listener, однако, поскольку netbeans сгенерировал GUI, я не могуПосмотрите, как реализовать интерфейсы, поскольку я не могу редактировать код, который создает jPANEL и т. д. Все это очень расстраивает, и я действительно не верю, что это должно быть так сложно.

В качестве теста я добавил requestFocusInWindow(); к кнопке на панели, и она установила фокус на нужный вход.

Ответы [ 9 ]

17 голосов
/ 10 января 2011

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

Чтобы решить эту проблему, я добавил глобальный метод в свой main, который называетсяметод в панели, которая вызвала requestFocusInWindow() в текстовой области.Я поместил вызов глобального метода в кнопку, которая показала панель, после вызова, чтобы показать.Это означало, что панель будет показана, а затем текстовая область назначит фокус после отображения панели.Надеюсь, что это имеет смысл и помогает!

Кроме того, вы можете редактировать большую часть автоматически сгенерированного кода, щелкнув правой кнопкой мыши по объекту в режиме конструктора и выбрав настройку кода, однако я не думаю, что это позволяет вамредактировать панели.

11 голосов
/ 09 января 2011

Я не уверен, что я что-то здесь упускаю, но нет причины, по которой вы не можете добавить слушателя на свою панель.

В Netbeans просто нажмите кнопку «Источник» в левом верхнем углу окна редактора, и вы сможете редактировать большую часть кода. Фактический код макета в основном заблокирован, но вы можете даже настроить его, если вам нужно.

Насколько я знаю, txtMessage.requestFocusInWindow() должен установить фокус по умолчанию, когда окно отображается в первый раз. Если вы хотите запросить фокусировку после того, как окно уже было отображено, вы должны использовать txtMessage.requestFocus()

Для тестирования вы можете просто добавить слушатель в конструктор:

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    txtMessage.requestFocus();
  } 
}); 
5 голосов
/ 02 июня 2012

В JFrame или JDialog вы всегда можете перезаписать метод setVisible (), он работает хорошо.Я не пробовал в JPanel, но может быть альтернативой.

@Override
public void setVisible(boolean value) {
    super.setVisible(value);
    control.requestFocusInWindow();
}
2 голосов
/ 26 апреля 2017

Я сделал это, установив событие AncesterAdded в textField и запрашивая фокус в окне.

2 голосов
/ 01 декабря 2015

Я играл с этим вечно и наконец нашел то, что, кажется, всегда работает!

    textField = new JTextField() {

        public void addNotify() {
            super.addNotify();
            requestFocus();
        }
    };
1 голос
/ 02 ноября 2017

Если вы создаете GUI с Netbeans , вы также можете вставить некоторый код, написанный самим собой.Просто выберите элемент (возможно, кнопку, панель или окно) и используйте вкладку «Код» в диалоге «Свойства».

Там вы можете вставить Pre- и Post- код для различных частей процесса создания.

Я думаю, что "After-All-"Окно "Set-Code" окна является хорошим местом для вашего кода, или вы можете привязать его к событию ("Свойства" -dialog -> "События") " componentShown " текстового поля /панель.

1 голос
/ 24 марта 2016

Ничего из вышеперечисленного не сработало для меня, потому что у меня окно JPopupMenu.

Что сработало так:

addAncestorListener(new AncestorListener() {
    @Override
    public void ancestorAdded(AncestorEvent ae) {
        myEdit.requestFocus();
    }

    // ... other ancestor listener methods
}
1 голос
/ 11 декабря 2014

Для меня самый простой способ заставить его работать, это поместить строку component.requestFocus();, после строки setVisible(true);, внизу вашего фрейма или конструктора панели.

Вероятно, это как-то связано с запросом фокуса после того, как все компоненты были созданы, потому что создание нового компонента, после запроса фокуса, сделает ваш компонент потерянным, и фокус переместится на ваш вновь созданный компонент. По крайней мере, я так думаю.

0 голосов
/ 11 января 2019

Это просто:

textField.setFocus();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...