私も同じ問題を抱えていました。マウスを右クリックするだけでなく、まったく同じ(複雑な)メニュー項目のセットを含むトップメニュー。'Action'クラスは、有効化の選択について話している場合に考慮すべきものですが、可視性を扱っておらず、私の場合、再利用したい現在の選択に基づいたエントリの動的リストもありました。
そのため、実際に使用するメソッド(add()およびaddSeparator())に「Bridge」デザインパターン(私は思う)を実装することになりました。
public static class MenuBridge
{
private JPopupMenu popupMenu;
private JMenu menu;
public MenuBridge(JPopupMenu popupMenu)
{
this.popupMenu = popupMenu;
}
public MenuBridge(JMenu menu)
{
this.menu = menu;
}
public void addSeparator()
{
if(popupMenu!=null) popupMenu.addSeparator();
else menu.addSeparator();
}
public void add(JMenuItem item)
{
if(popupMenu!=null) popupMenu.add(item);
else menu.add(item);
}
}
したがって、メニュー項目を計算し、マウスの右クリックをトップレベルのメニューと同期させる再利用可能なメソッドを作成できます。
public void addTaskMenuItems(DefaultMenu menu, List<MDProcTask> taskList)
{
...
menu.add()/menu.addSeparator()
...
}
addTaskMenuItems(new DefaultMenu(popupMenu),taskList);
...
taskMenu.addMenuListener( new MenuListener() {
public void menuCanceled(MenuEvent menuevent)
{
}
public void menuDeselected(MenuEvent menuevent)
{
}
public void menuSelected(MenuEvent menuevent)
{
taskMenu.removeAll();
addTaskMenuItems( new DefaultMenu(taskMenu),getSelectedTasks());
taskMenu.revalidate();
}});