• category: swing folder: PopupWithoutClickOnMenu title: JMenuの領域内にマウスカーソルでポップアップメニューを表示する tags: [JMenu, MouseListener] author: aterai pubdate: 2013-02-18T00:29:59+09:00 description: JMenuの領域内にマウスカーソルが入ったときにポップアップメニューが開くように設定します。 image: https://lh3.googleusercontent.com/-shu8CDTfLvg/USCnbrWYstI/AAAAAAAABd0/qODgUmweras/s800/PopupWithoutClickOnMenu.png

概要

JMenuの領域内にマウスカーソルが入ったときにポップアップメニューが開くように設定します。

サンプルコード

visitAll(menubar, new MouseAdapter() {
  @Override public void mousePressed(MouseEvent e) {
    if (check.isSelected()) {
      ((AbstractButton) e.getComponent()).doClick();
    }
  }

  @Override public void mouseEntered(MouseEvent e) {
    if (check.isSelected()) {
      ((AbstractButton) e.getComponent()).doClick();
    }
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、トップレベルの(JMenuBarの子コンポーネントになっている)JMenuの領域内にマウスカーソルが入った場合に自動的にポップアップメニューが開くように、JMenu#doClick()を実行するMouseListenerを追加しています。

/*
 * Build an array of menu elements - from <code>PopupMenu</code> to
 * the root <code>JMenuBar</code>.
 * @param  leaf  the leaf node from which to start building up the array
 * @return the array of menu items
 */
private MenuElement[] buildMenuElementArray(JMenu leaf) {
    Vector<MenuElement> elements = new Vector<MenuElement>();
    Component current = leaf.getPopupMenu();
    JPopupMenu pop;
    JMenu menu;
    JMenuBar bar;

    while (true) {
        if (current instanceof JPopupMenu) {
            pop = (JPopupMenu) current;
            elements.insertElementAt(pop, 0);
            current = pop.getInvoker();
        } else if (current instanceof JMenu) {
            menu = (JMenu) current;
            elements.insertElementAt(menu, 0);
            current = menu.getParent();
        } else if (current instanceof JMenuBar) {
            bar = (JMenuBar) current;
            elements.insertElementAt(bar, 0);
            MenuElement me[] = new MenuElement[elements.size()];
            elements.copyInto(me);
            return me;
        }
    }
}

参考リンク

コメント