• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JPopupMenuをボタンの長押しで表示
#navi(../)
#tags()
#tags(JToolBar, JButton, JPopupMenu, MouseListener, GridLayout)
RIGHT:Posted by &author(aterai); at 2009-01-26
*JPopupMenuをボタンの長押しで表示 [#m55da14e]
JToolBarに、長押しでJPopupMenu、クリックで選択されたメニューを表示するボタンを追加します。
* JPopupMenuをボタンの長押しで表示 [#m55da14e]
`JToolBar`に、長押しで`JPopupMenu`、クリックで選択されたメニューを表示するボタンを追加します。

-&jnlp;
-&jar;
-&zip;
#download
#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRIzHMLNI/AAAAAAAAAgs/0_PwsyZOl-I/s800/PressAndHoldButton.png)

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTRIzHMLNI/AAAAAAAAAgs/0_PwsyZOl-I/s800/PressAndHoldButton.png)

**サンプルコード [#n8b1ddb4]
** サンプルコード [#n8b1ddb4]
#code(link){{
private class ArrowButtonHandler extends AbstractAction implements MouseListener {
  private final javax.swing.Timer autoRepeatTimer;
  private AbstractButton arrowButton = null;
  public ArrowButtonHandler() {
    autoRepeatTimer = new javax.swing.Timer(1000, new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println("InitialDelay(1000)");
        if(arrowButton!=null && arrowButton.getModel().isPressed()
                             && autoRepeatTimer.isRunning()) {
          autoRepeatTimer.stop();
          pop.show(arrowButton, 0, arrowButton.getHeight());
          pop.requestFocusInWindow();
        }
      }
    });
    autoRepeatTimer.setInitialDelay(1000);
    pop.addPopupMenuListener(new PopupMenuListener() {
      @Override public void popupMenuCanceled(PopupMenuEvent e) {}
      @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
      @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        if(arrowButton!=null) {
          arrowButton.setSelected(false);
        }
      }
    });
  }
  @Override public void actionPerformed(ActionEvent e) {
    if(autoRepeatTimer.isRunning()) {
      System.out.println("actionPerformed");
      System.out.println("  "+bg.getSelection().getActionCommand());
      if(arrowButton!=null) arrowButton.setSelected(false);
      autoRepeatTimer.stop();
    }
  }
  @Override public void mousePressed(MouseEvent e) {
    System.out.println("mousePressed");
    if(SwingUtilities.isLeftMouseButton(e) && e.getComponent().isEnabled()) {
      arrowButton = (AbstractButton)e.getSource();
      autoRepeatTimer.start();
    }
  }
  @Override public void mouseReleased(MouseEvent e) {
    autoRepeatTimer.stop();
  }
  @Override public void mouseExited(MouseEvent e) {
    if(autoRepeatTimer.isRunning()) {
      autoRepeatTimer.stop();
    }
  }
  @Override public void mouseEntered(MouseEvent e) {}
  @Override public void mouseClicked(MouseEvent e) {}
}
}}

**解説 [#m649a122]
上記のサンプルでは、1000ミリ秒ボタンを押したままにしておくと、JRadioButtonを配置したJPopupMenuを表示します。普通にクリックした場合は、現在選択されているJRadioButtonの色をコンソールに出力するようになっています。
** 解説 [#m649a122]
上記のサンプルでは、`1000`ミリ秒ボタンを押したままにしておくと、`JRadioButton`を配置した`JPopupMenu`を表示します。普通にクリックした場合は、現在選択されている`JRadioButton`の色をコンソールに出力するようになっています。

----
JPopupMenuのレイアウトをpop.setLayout(new GridLayout(0,3));で変更し、三列にJRadioButtonを並べています。
`JPopupMenu`のレイアウトを`pop.setLayout(new GridLayout(0,3));`で変更し、三列に`JRadioButton`を並べています。

//**参考リンク
**コメント [#b93295c6]
** コメント [#b93295c6]
#comment