如何让JPopupMenu透明化?

nat*_*han 5 java swing transparent jpopupmenu jpopup

我想自定义外观,JPopupMenu所以我在i上创建了一个自定义类,扩展了JPopupMenu类,覆盖了paintComponent方法,就像我需要自定义的任何组件一样.

public class CustomPopupMenu extends JPopupMenu {

    @Override
    public paintComponent(Graphics g) {
        //custom draw
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道的唯一问题是我无法JPopupMenu透明化.我setOpaque(false)觉得够了,我错了.

我怎样才能JPopupMenu透明?

Dur*_*dal 3

弹出菜单的问题在于,它可能被实现为顶级容器(窗口),而窗口是不透明的,无论您使用 setOpaque() 设置什么值,它都是不透明的。但窗户也可以做成半透明的。

您可以通过强制使用重量级弹出窗口并粗暴地改变其不透明度来破解它。尝试将此作为实验的起始基础(Java7):

import java.awt.Window;

import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class TranslucentPopup extends JPopupMenu {

    {
        // need to disable that to work
        setLightWeightPopupEnabled(false);
    }

    @Override
    public void setVisible(boolean visible) {
        if (visible == isVisible())
            return;
        super.setVisible(visible);
        if (visible) {
            // attempt to set tranparency
            try {
                Window w = SwingUtilities.getWindowAncestor(this);
                w.setOpacity(0.667F);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,它不会使子菜单变得半透明!

  • 嗯..为什么要反射?SwingUtilities.getWindowAncestor(this) 应该足以获取包含的窗口 (3认同)
  • 对于子菜单,对自定义 JMenu 执行相同的操作:覆盖 setPopupMenuVisible 并强制弹出窗口的 windowAncestor 为半透明 (2认同)