您的位置:首页 > 产品设计 > 产品经理

郁闷的JPopupMenu

2007-12-18 21:04 190 查看
     在学习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时都要先解除和原来父容器的联系。

偷懒的梦想就此破灭了.........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jcomponent swing menu null jdk