Parando o JPopupMenu roubando o foco

eu tenho umJTextField para o qual eu estou esperando para sugerir resultados para coincidir com a entrada do usuário. Estou exibindo essas sugestões em umJList contido dentro de umJPopupMenu.

Contudo, ao abrir o menu popup programaticamente viashow(Component invoker, int x, int y), o foco está sendo tirado doJTextField.

Estranhamente, se eu ligarsetVisible(true) em vez disso, o foco não é roubado; mas depois oJPopupMenu não está anexado a nenhum painel e, ao minimizar a aplicação enquanto a caixa está aberta, ela permanece pintada na janela.

Eu também tentei redefinir o foco para oJTextField usandorequestFocus(), mas depois tenho que restaurar a posição do cursor usandoSwingUtilities.invokeLater(), e asinvocar depois O lado das coisas é dar ao usuário uma pequena margem para mexer com o conteúdo existente / sobrescrevê-lo / ou fazer outras coisas imprevisíveis.

O código que tenho é efetivamente:

<code>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());
    }
});
</code>

Alguém pode sugerir a melhor avenida para descer para mostrar oJPopupMenu programaticamente, preservando o foco noJTextField?

questionAnswers(3)

yourAnswerToTheQuestion