在学习swing的菜单时,想到将主菜单的菜单项直接加到弹出式菜单中,这样可以一石二鸟,一个菜单项就搞定两个地方了。例如下面代码:
但结果却不是想象的那样,弹出式菜单出来了,菜单里面的menuItem1不见了,把两个add方法调换位置,菜单正常了,弹出式菜单又丢了menuItem1。郁闷了一段时间,静下心来想想吧,根据几次运行的结果可以得出,执行add方法加入菜单项时会解除此菜单项原来的关联。最后决定去JDK源代码查查(记得很多高人都说在那里可以学到很多东西 )。
JPopupMenu.java中:
那就向上追查super吧,可惜JComponent中什么都没有,继续向上,Container.java中:
还么看到什么实质东西,继续:
呵呵,终于找到了,看来每次add时都要先解除和原来父容器的联系。
偷懒的梦想就此破灭了.........
.........
JMenu menu1 = new JMenu( " menu1 " );
JPopupMenu popupMenu1 = new JPopupMenu();
JMenuItem menuItem1 = new JMenuItem( " something " );
menu1.add(menuItem1);
popupMenu1.add(menuItem1);
menuItem1.addActionListener(.....);
...........
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.add(menuItem);
return menuItem;
}
那就向上追查super吧,可惜JComponent中什么都没有,继续向上,Container.java中:
public
Component add(Component comp)
{
addImpl(comp, null, -1);
return 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");
}
}
... ...
... ...
... ...
}
... ...
... ...
... ...
/* 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时都要先解除和原来父容器的联系。
偷懒的梦想就此破灭了.........