调整JPopupMenu的大小并避免“闪烁”问题

时间:2010-05-27 15:58:58

标签: java swing menu paint repaint

我正在尝试实现类似于此处找到的样式的搜索结果弹出列表:

http://www.inquisitorx.com/

(我不打算实施Google搜索,我只是将其作为我正在研究的风格的粗略示例。)

无论如何,我使用JList中包含的JPopupMenu来实现此功能,JTextField位于pack下方。

当用户输入搜索字词时,列表会更改以反映不同的匹配结果。然后我在JPopupMenu上调用getPopup来调整大小。 但是,这会产生轻微的闪烁效果,因为它实际上隐藏了弹出窗口并显示弹出窗口。 (请参阅JPopupMenu中明确执行此操作的私有方法JWindow。)

有没有办法让它自己调整大小(除了使用{{1}})?

3 个答案:

答案 0 :(得分:2)

给我工作:

<强> popup.pack();

<强> popup.validate();

这项工作在linux下用java版“1.6.0_34”。我不知道是在Windows上工作。

答案 1 :(得分:1)

setSize()方法在我的情况下不起作用。 popup.pack()方法确实有效,但也导致了闪烁。我找到的最佳解决方案是here找到的解决方案。简而言之:

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

答案 2 :(得分:0)

你试过setSize()吗?它似乎在JComponent处理,可能会避免重绘问题。

我认为getPopup正在解决的问题是当弹出窗口的尺寸不适合窗口时要做什么。当发生这种情况时,它会从轻量级组件回落到重量级组件,这肯定需要隐藏和显示。所以,我认为如果你能保证你的弹出窗口不会延伸到窗口之外,那么setSize就可以解决这个问题。