Swing使JPopupMenu背景透明

13 篇文章 2 订阅

问题背景

现在要使JPopupMenu背景完全透明,并且我想自定义它的背景,并且不影响它的菜单项的样式

解决过程

首先看到这个需求,按照基本思路是重写JPopupMenu类,重写paintComponent方法画一个背景。但是JPopupMenu与其他组件的自定义方法不同,它没有我们想象地那么简单,它是基于Window类的一个重量级组件,你会发现,即便是重写了该方法,并且什么也不做,依旧会有一个灰色的背景!并且setOpaque(false)依旧无效!

@Override
protected void paintComponent(Graphics g) {
	// 什么也不画
}

解决问题的根本在于想办法JPopupMenu类对应的Window完全透明,首先我们得设置它为重量级弹出以使用Window

setDefaultLightWeightPopupEnabled(false);

然后重写setVisible方法,SwingUtilities.getWindowAncestor(this)获取对应的Window对象,然后AWTUtilities.setWindowOpaque(w, false);使该Window对象的背景透明即可,完美解决!

@Override
public void setVisible(boolean b) {
    if (b == isVisible())
        return;
    super.setVisible(b);
    if (b) {
        // attempt to set tranparency
        try {
            Window w = SwingUtilities.getWindowAncestor(this);
            AWTUtilities.setWindowOpaque(w, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意: 有人可能会问为什么不用setOpacity来设置Window透明度,是因为这个方法设置的是整个窗口以及子组件的透明度,意味着你设置为0之后整个JPopupMenu就看不到了,而setWindowOpaque仅仅是让Swing不去画窗口的背景!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值