У меня есть JTextField
, для которого я надеюсь предложить результаты в соответствии с пользовательским вводом. Я показываю эти предложения в JList
, содержащемся в JPopupMenu
.
Однако при открытии всплывающего меню программно через show(Component invoker, int x, int y)
фокус берется из JTextField
.
Как ни странно, если я назову setVisible(true)
, фокус не будет украден; но затем JPopupMenu
не прикреплен к какой-либо панели, и при минимизации приложения, пока поле открыто, оно остается окрашенным в окне.
Я также попытался reset сосредоточиться на JTextField
с помощью requestFocus()
, но затем мне нужно восстановить позицию каретки с помощью SwingUtilities.invokeLater()
, а вызывать последующую сторону вещей дает пользователю небольшой запас, чтобы обходиться с существующим содержимым/перезаписывать его/или делать другие непредсказуемые вещи.
Код, который у меня есть, эффективен:
JTextField field = new JTextField();
JPopupMenu menu = new JPopupMenu();
field.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
JList list = getAListOfResults();
menu.add(list);
menu.show(field, 0, field.getHeight());
}
});
Может ли кто-нибудь предложить лучший способ пойти вниз, чтобы показать JPopupMenu
программно, сохраняя фокус на JTextField
?