2015-05-20 5 views
1

Я пишу программу в Java Swing, и в этой программе будет панель поиска (которая будет JTextField), и когда в это поле что-то введено, я хочу отобразить результаты поиска во всплывающем меню прямо под ним панель поиска, как это делает Google. Мне не нужно на самом деле заполнять меню результатами поиска (у меня в настоящее время есть тестовое меню с фиксированными элементами), я застрял в проблеме, что каждый раз, когда новый символ вводится в полевой фокус, убирается с поля и в контекстное меню. Я используюКак показать JPopupMenu без кражи фокуса?

show(Component invoker, int x, int y) 

для отображения меню, при этом invoker является текстовым полем или содержащим полем. И, как я уже сказал, каждый раз, когда эта функция называется всплывающим меню, фокус отходит от текстового поля, что является большой проблемой. Вместо того, чтобы использовать этот метод шоу я мог бы использовать эти:

setLocation(int x, int y) 
setVisible(boolean b) 

Однако без запустившего всплывающее меню не отображается по отношению к строке поиска, и, когда я использую setInvoker (компонент INVOKER) У меня такая же проблема, как с помощью метода show. Я не могу установить invoker во время инициализации, потому что invoker не отображается тогда. Итак, как мне создать этот popupMenu с invoker, не отвлекаясь от текстового поля поиска? Или есть лучший способ сделать то, что я пытаюсь выполнить?

+0

«Основная» причина фокуса потеряна, потому что что-то во всплывающем окне крадет его. AFAIK, 'JPopupMenu' не имеет тенденций менять фокус сам по себе. Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

ответ

3

Вы пробовали requestFocusInWindow()? Я думаю, вам нужно вернуть фокус в текстовое поле поиска в конце кода всплывающего меню. Я предполагаю, что у вас есть код для создания всплывающего меню. Добавьте searchTextField.requestFocusInWindow() в конец этого кода. Если это не поможет, мне нужна дополнительная информация. Еще один код поможет.

+0

Выполнение запросаFocusInWindow() сразу после show/setInvoker работает. Благодаря! – danglingPointer

Смежные вопросы