2010-05-27 3 views
0

я пытаюсь осуществить поиск списка результатов всплывающий, похожий на стиль найти здесь:Изменение размера JPopupMenu и избежать «мерцания» вопрос

http://www.inquisitorx.com/

(я не пытался осуществить поиск Google, Я просто использую это как грубый пример стиля я работаю.)

В любом случае, я реализую это с помощью JList, содержащейся в JPopupMenu, который выскочил под более JTextField.

Когда пользователь вводит условия поиска, список изменяется, чтобы отражать разные результаты поиска. Затем я звоню pack на JPopupMenu, чтобы изменить его размер. Это работает, однако, создает небольшой эффект мерцания, поскольку он фактически скрывает всплывающее окно и показывает всплывающее окно. (См частный метод getPopup в JPopupMenu, где он явно делает это.)

Есть ли способ, чтобы просто получить его, чтобы просто изменить размер себя (помимо использования JWindow)?

+0

В конце концов, я закончил использовать JWindow. Это может быть тяжело, но это работает. – Avrom

ответ

0

Вы попробовали setSize()? Похоже, что это обрабатывается в JComponent и может избежать проблем с перерисовкой.

Я думаю, что проблема, с которой адресуется getPopup, заключается в том, что делать, когда размеры всплывающего окна не помещаются в окне. Когда это происходит, он опускается с легкого компонента на тяжеловес, и это определенно требует скрытия и шоу. Поэтому я думаю, что если вы можете гарантировать, что всплывающее окно не будет выходить за пределы окна, setSize может сделать трюк.

+0

Основываясь на том, что я прочитал в коде Sun, я верю, что вы правы. Он использует PopupFactory для получения всплывающего объекта, который возвращает версии light/medium/heavyweight в зависимости от случая. Существует метод setPopupSize, но он также вызывает тот же метод getPopup. – Avrom

+0

Использование setSize привело к другим нежелательным проблемам с краской. – Avrom

2

мне работать:

popup.pack();

popup.validate();

Эта работа в linux с версией java «1.6.0_34». Я не знаю, что это работа над окнами.

1

Метод setSize() не работает в моем случае. Подход popup.pack() действительно работал, но также приводил к мерцанию. Лучшим решением, которое я нашел, был найден here. Короче говоря:

Window window = SwingUtilities.getWindowAncestor(popupMenu); 
    window.pack(); 
    window.validate(); 
Смежные вопросы