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