我正在使用以下代码创建JPopUpMenu:
JPopupMenu popup1 = new JPopupMenu();
JPopupMenu popup2 = new JPopupMenu();
JMenuItem freeze = new JMenuItem("freeze");
freeze.addActionListener(new FreezActionListener(this));
JMenuItem unfreeze = new JMenuItem("unfreeze");
unfreeze.addActionListener(new UnFreezActionListener(this));
JMenuItem sortU = new JMenuItem("sort");
JMenuItem sortD = new JMenuItem("sort");
popup1.add(freeze);
popup1.add(unfreeze);
popup1.add(sortU);
popup2.add(freeze);
popup2.add(unfreeze);
popup2.add(sortD);
执行此代码后,popup2
菜单工作正常但popup1
只有sortU
项。
如果我首先将菜单项添加到popup2
然后再添加到popup1
,那么popup1
工作正常,而popup2
则不然。
这是正常行为还是我错过了什么?
我搜索了这个,但找不到任何东西
答案 0 :(得分:3)
JMenuItem
属于一个JPopupMenu
(或任何其他菜单)。您不能将Swing组件添加到多个容器中;如果这样做,那么该组件将自动从前一个容器中删除。因此,当您将freeze
和unfreeze
添加到popup2
时,它们会自动从popup1
中删除。
要使其正常工作,您需要做的是创建总共六个JMenuItem
,每个菜单三个。两对菜单项执行相同操作的事实仅反映在ActionListener
对每个菜单项执行相同操作。所以....
JPopupMenu popup1 = new JPopupMenu();
JPopupMenu popup2 = new JPopupMenu();
FreezActionListener freezer = new FreezActionListener(this);
JMenuItem freeze1 = new JMenuItem("freeze");
freeze1.addActionListener(freezer);
JMenuItem freeze2 = new JMenuItem("freeze");
freeze2.addActionListener(freezer);
UnFreezActionListener unfreezer = new UnFreezActionListener(this);
JMenuItem unfreeze1 = new JMenuItem("unfreeze");
unfreeze1.addActionListener(unfreezer);
JMenuItem unfreeze2 = new JMenuItem("unfreeze");
unfreeze2.addActionListener(unfreezer);
JMenuItem sortU = new JMenuItem("sort");
JMenuItem sortD = new JMenuItem("sort");
popup1.add(freeze1);
popup1.add(unfreeze1);
popup1.add(sortU);
popup2.add(freeze2);
popup2.add(unfreeze2);
popup2.add(sortD);
答案 1 :(得分:1)
实际上,更好的解决方案是创建动作。可以共享操作并将其添加到多个组件(JMenuItems,JButtons等)。您甚至可以启用/禁用Action,它将同时启用/禁用所有组件。
您可以阅读How to Use Actions上Swing教程中的部分以获取更多信息。