Настройка фокуса на текстовое поле
У меня есть приложение, разработанное в netbeans, и я хочу установить фокус на определенный jTextField
при отображении панели. Я прочитал несколько сообщений и попробовал разные методы, но не работал. Одна из основных проблем заключается в том, где разместить требуемый код, который, я считаю, в моем случае this.txtMessage.requestFocusInWindow();
Есть несколько сообщений, которые указывают использование Listener, но поскольку netbeans сгенерировал GUI, я не вижу, как реализовать интерфейсы, поскольку я не могу редактировать код, который создает jPANEL и т.д. Все это очень расстраивает, и я действительно не верю, что это должно быть так сложно.
В качестве теста я добавил кнопку requestFocusInWindow();
к кнопке на панели, и она установила фокус на желаемый вход.
Ответы
Ответ 1
У меня был аналогичный сценарий, когда мне нужно было сосредоточиться на текстовом поле внутри панели, когда была показана панель. Панель была загружена при запуске приложения, поэтому я не мог установить фокус в конструкторе. Поскольку панель не загружалась или не фокусировалась на шоу, это означало, что у меня не было никакого события, чтобы запустить запрос фокуса.
Чтобы решить эту проблему, я добавил глобальный метод, который вызвал метод в панели, который вызывал requestFocusInWindow()
в текстовой области. Я поместил вызов глобальному методу в кнопку, которая показала панель, после вызова, чтобы показать. Это означало, что панель будет показана, а затем текстовая область назначила фокус после отображения панели. Надеюсь, что это имеет смысл и помогает!
Кроме того, вы можете отредактировать большую часть автоматически сгенерированного кода, щелкнув правой кнопкой мыши на объекте в представлении дизайна и выбрав индивидуальный код, однако я не думаю, что он позволяет редактировать панели.
Ответ 2
Я не уверен, что здесь что-то не хватает, но нет причин, по которым вы не можете добавить слушателя на свою панель.
В Netbeans просто нажмите кнопку "Источник" в левом верхнем углу окна редактора, и вы можете редактировать большую часть кода. Фактический код компоновки в основном заблокирован, но вы можете даже настроить его, если вам нужно.
Насколько мне известно, txtMessage.requestFocusInWindow()
должен настроить фокус по умолчанию, когда окно отображается в первый раз. Если вы хотите запросить фокус после того, как окно уже было отображено, вы должны использовать txtMessage.requestFocus()
Для тестирования вы можете просто добавить слушателя в конструктор:
addWindowListener(new WindowAdapter(){
public void windowOpened( WindowEvent e){
txtMessage.requestFocus();
}
});
Ответ 3
В JFrame или JDialog вы всегда можете перезаписать метод setVisible(), он работает хорошо. Я не пробовал в JPanel, но может быть альтернативой.
@Override
public void setVisible(boolean value) {
super.setVisible(value);
control.requestFocusInWindow();
}
Ответ 4
Я играл с этим навсегда и, наконец, нашел то, что, кажется, всегда работает!
textField = new JTextField() {
public void addNotify() {
super.addNotify();
requestFocus();
}
};
Ответ 5
Я сделал это, установив событие AncesterAdded на textField и запрашивающий фокус в окне.
Ответ 6
Для меня самый простой способ заставить его работать: положить строку component.requestFocus();
после строки setVisible(true);
в нижней части вашего фрейма или конструктора панели.
Вероятно, это связано с запросом фокуса, поскольку все компоненты были созданы, потому что создание нового компонента после запроса запроса фокуса сделает ваш компонент незаметным и сосредоточит внимание на вашем вновь созданный компонент.
По крайней мере, это то, что я предполагаю.
Ответ 7
Ни одно из вышеперечисленных не работало для меня, потому что мое окно - JPopupMenu
.
Что это за работа:
addAncestorListener(new AncestorListener() {
@Override
public void ancestorAdded(AncestorEvent ae) {
myEdit.requestFocus();
}
// ... other ancestor listener methods
}
Ответ 8
Если вы создаете графический интерфейс с Netbeans, вы также можете вставить код самостоятельно. Просто выберите элемент (возможно, кнопку, панель или окно) и используйте "Код" -tab в диалоговом окне "Свойства".
Здесь вы можете вставлять Pre- и Post-code для различных частей процесса создания.
Я думаю, что поле "After-All-Set-Code" окна является хорошим местом для вашего кода, или вы можете привязать его к событию ( "Свойства" -диалог → "События" ) " componentShown" текстового поля/панели.
Ответ 9
Это легко:
textField.setFocus();