Java JPopUpMenu添加菜单项时出现问题

Java JPopUpMenu添加菜单项时出现问题,java,swing,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");

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

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

一个JMenuItem属于一个,并且只有一个,jpopmpmenu或任何其他菜单。不能将Swing组件添加到多个容器中;如果这样做,则该组件将自动从上一个容器中删除。因此,当您将冻结和解冻添加到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);
JMenuItem只属于一个JPOppMenu或任何其他菜单。不能将Swing组件添加到多个容器中;如果这样做,则该组件将自动从上一个容器中删除。因此,当您将冻结和解冻添加到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);

实际上,更好的解决办法是创造行动。操作可以共享并添加到多个组件JMenuItems、JButtons等。您甚至可以启用/禁用该操作,该操作将同时启用/禁用所有组件


您可以阅读上Swing教程的部分以了解更多信息。

实际上更好的解决方案是创建操作。操作可以共享并添加到多个组件JMenuItems、JButtons等。您甚至可以启用/禁用该操作,该操作将同时启用/禁用所有组件


您可以阅读上Swing教程的部分以了解更多信息。

无需创建多个侦听器。监听器与组件不同,可以共享。这就是我匆忙复制和粘贴代码时发生的情况……感谢您的评论。我会解决这个问题。不需要创建多个侦听器。监听器与组件不同,可以共享。这就是我匆忙复制和粘贴代码时发生的情况……感谢您的评论。我会解决这个问题。我知道这是发布多年后的事,但为了满足我的好奇心,我无意中发现了它,我想说,虽然你的答案缺乏细节和实施示例,但我认为这可能是一个更正确的答案,尽管被接受的答案同样有效。我知道这是发布多年后的事,但为了满足我的好奇心,我无意中发现了它,我想说的是,虽然你的答案缺乏细节和实施示例,但我认为这可能是一个更正确的答案,尽管公认的答案也适用。