JPopUpMenu添加菜单项的问题

时间:2009-10-30 17:53:26

标签: java swing

我正在使用以下代码创建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则不然。

这是正常行为还是我错过了什么?
我搜索了这个,但找不到任何东西

2 个答案:

答案 0 :(得分:3)

JMenuItem属于一个JPopupMenu(或任何其他菜单)。您不能将Swing组件添加到多个容器中;如果这样做,那么该组件将自动从前一个容器中删除。因此,当您将freezeunfreeze添加到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教程中的部分以获取更多信息。