2010-05-27 28 views
0

我想實現在這裏發現了類似的風格在搜索結果彈出列表:調整大小的JPopupMenu,避免了「忽悠」的問題

http://www.inquisitorx.com/

(我並不想實現一個谷歌搜索,我只是用這個作爲我工作作風的一個粗略的例子。)

在任何情況下,我通過使用包含其彈出的JTextField下一個JPopupMenuJList實現這一點。

當用戶輸入搜索詞時,列表會更改以反映不同的匹配結果。然後我撥packJPopupMenu調整它的大小。 但是,這可以產生輕微的閃爍效果,因爲它實際上隱藏了彈出窗口並顯示了一個彈出窗口。 (見JPopupMenu私有方法getPopup它明確地做到這一點。)

有什麼辦法只得到它只是調整本身(除了使用JWindow)?

+0

最後,我結束了使用JWindow。這可能是沉重的,但它有效。 – Avrom 2010-06-02 14:56:26

回答

0

你試過setSize()?它看起來像在JComponent處理,並可能避免重繪問題。

我認爲getPopup正在解決的問題是當彈出窗口的尺寸不適合窗口內容時應該怎麼做。當發生這種情況時,它會從輕量級組件重新回到重量級,這絕對需要隱藏和顯示。所以,我認爲如果你能保證你的彈出窗口不會超出窗口的範圍,那麼setSize可能會做到這一點。

+0

根據我在Sun的代碼中讀到的內容,我相信你是對的。它使用PopupFactory來獲取一個彈出對象,該對象根據情況返回輕/中/重磅版本。 有一個setPopupSize方法,但它也調用相同的getPopup方法。 – Avrom 2010-05-28 13:55:55

+0

使用setSize導致了其他不需要的繪畫問題。 – Avrom 2010-05-28 14:00:11

2

到我工作:

popup.pack();

popup.validate();

這個工作在Java版本爲「1.6.0_34」的linux中。我不知道在windows上工作。

1

setSize()方法在我的情況下不起作用。 popup.pack()方法確實有效,但也導致了閃爍。我找到的最好的解決方案是找到的here。總之:

Window window = SwingUtilities.getWindowAncestor(popupMenu); 
    window.pack(); 
    window.validate();