我的问题类似于this,但我认为有一个更简单的例子。
基本上通过调用AWTUtilities.setWindowOpaque(window, false)
使JFrame的背景透明,我的JPopupMenu有时会显示为空白。
public class JavaApplication8 {
JPopupMenu popup;
JMenuItem open;
JLabel bgLabel = new JLabel("testing");
public static void main(String[] args) {
// TODO code application logic here
JFrame window = new JFrame("test");
URL bgURL = JavaApplication8.class.getResource("images/bg.jpg");
ImageIcon bg = new ImageIcon(bgURL);
JavaApplication8 test = new JavaApplication8();
test.setPopupMenu();
test.bgLabel.setIcon(bg);
window.add(test.bgLabel, BorderLayout.CENTER);
window.setUndecorated(true);
AWTUtilities.setWindowOpaque(window, false);
//window.pack();
window.setSize(200, 200);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
}
public void setPopupMenu(){
popup = new JPopupMenu();
open = new JMenuItem("Test");
popup.add(open);
this.bgLabel.setComponentPopupMenu(popup);
}
}
以下是正在发生的事情的图像:
有趣的是,每当我点击JFrame的右侧时就会发生这种情况。不知道为什么。请记住,我并非100%确定AWTUtilities.setWindowOpaque(window, false)
确实是导致此问题的原因,但每当我删除该行时,一切似乎都很顺利。
编辑:正如camickr
所述,looks like this happens when the popup menu is not fully contained in the bounds of the parent window.
答案 0 :(得分:2)
只要我点击JFrame的右侧,就会发生这种情况
当弹出菜单未完全包含在父窗口的边界内时,会发生这种情况。不知道如何解决这个问题。
在Java 7中,您可以使用:
frame.setBackground(new Color(0, 0, 0, 0));
透明度。
答案 1 :(得分:2)
<强>背景强>
我不确定为什么使用透明/半透明背景会导致重量级弹出窗口以及它们如何绘制问题,但确实如此 - 无论您是否使用AWTUtilities.setWindowOpaque(window, false)
或frame.setBackground(new Color(0, 0, 0, 0))
。
当弹出窗口无法完全适合目标窗口时,会创建HeavyWeightPopup
。所以+ User2280704如果你点击窗口的最底部,你的问题也会出现。 LightWeightPopup
没有这个问题 - 因此,菜单在窗口中间工作。
另外,有趣的是,通常菜单会在第一次渲染时很好,而不是以下时间。
<强>答案:强> 我想出了一个解决方法,在弹出任何弹出窗口后调用重绘。只需在启动应用程序时调用以下代码即可。
PopupFactory.setSharedInstance(new PopupFactory()
{
@Override
public Popup getPopup(Component owner, final Component contents, int x, int y) throws IllegalArgumentException
{
Popup popup = super.getPopup(owner, contents, x, y);
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
contents.repaint();
}
});
return popup;
}
});