У меня есть 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?