郁闷的JPopupMenu

来源:互联网 发布:矩阵论 清华大学 pdf 编辑:程序博客网 时间:2024/05/16 10:29
     在学习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时都要先解除和原来父容器的联系。

偷懒的梦想就此破灭了.........
原创粉丝点击