郁闷的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时都要先解除和原来父容器的联系。
偷懒的梦想就此破灭了.........
.........
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时都要先解除和原来父容器的联系。
偷懒的梦想就此破灭了.........
相关文章推荐
- 献给正在郁闷的人
- WindowsServer2003R2、IIS6下非常让人郁闷的ASP.NET MVC
- [bzoj1503][NOI2004]郁闷的出纳员
- 2006TECHED广州才一天半,郁闷
- POS机刷卡失败的郁闷事
- AVL树的操作——郁闷的出纳员,平衡树解法
- bzoj 1503 [NOI2004]郁闷的出纳员 splay tree
- 郁闷、、、
- 【NOI 2004】 郁闷的出纳员
- noi2004 郁闷的收纳员 treap
- bzoj1503 郁闷的出纳员
- 惊喜中有点郁闷
- 郁闷中
- 郁闷凌乱了
- NYOJ 267 郁闷的C小加(二)
- 浏览器也郁闷了,来吐个槽
- [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
- 郁闷死了 今天删了一个raid 卷 没有做备份 有么有大神教我恢复一下啊
- NOI2004 郁闷的出纳员
- 郁闷