郁闷的JPopupMenu

     在学习swing的菜单时,想到将主菜单的菜单项直接加到弹出式菜单中,这样可以一石二鸟,一个菜单项就搞定两个地方了。例如下面代码:
.........
JMenu menu1 
=   new  JMenu( " menu1 " );
JPopupMenu popupMenu1 
=   new  JPopupMenu();
JMenuItem menuItem1 
=   new  JMenuItem( " something " );

menu1.add(menuItem1);
popupMenu1.add(menuItem1);

menuItem1.addActionListener(.....);
...........

但结果却不是想象的那样,弹出式菜单出来了,菜单里面的menuItem1不见了,把两个add方法调换位置,菜单正常了,弹出式菜单又丢了menuItem1。郁闷了一段时间,静下心来想想吧,根据几次运行的结果可以得出,执行add方法加入菜单项时会解除此菜单项原来的关联。最后决定去JDK源代码查查(记得很多高人都说在那里可以学到很多东西 )。

    JPopupMenu.java中:
public  JMenuItem add(JMenuItem menuItem)  {
        
super.add(menuItem);
        
return menuItem;
    }

    那就向上追查super吧,可惜JComponent中什么都没有,继续向上,Container.java中:
     public  Component add(Component comp)  {
        addImpl(comp, 
null-1);
    
return comp;
    }

还么看到什么实质东西,继续:
    protected   void  addImpl(Component comp, Object constraints,  int  index)  {
        ... ...
        ... ...
        ... ...

        
/* Reparent the component and tidy up the tree's state. */
        
if (comp.parent != null{
        comp.parent.remove(comp);
                    
if (index > ncomponents) {
                        
throw new IllegalArgumentException("illegal component position");
                    }

            }

        ... ...
        ... ...
        ... ...

    }


呵呵,终于找到了,看来每次add时都要先解除和原来父容器的联系。

偷懒的梦想就此破灭了.........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值