У меня есть JTextField
, для которого я надеюсь предложить результаты, соответствующие вводу пользователя. Я показываю эти предложения в JList
, содержащемся в JPopupMenu
.
Однако при программном открытии всплывающего меню через show(Component invoker, int x, int y)
, фокус переносится с JTextField
.
Как ни странно, если вместо этого я вызову setVisible(true)
, фокус не украден; но тогда JPopupMenu
не привязан ни к одной панели, и при сворачивании приложения, когда окно открыто, оно остается нарисованным в окне.
Я также пытался сбросить фокус на 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
?