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

-&jnlp;
-&jar;
-&zip;

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

**サンプルコード [#n8b1ddb4]
#code{{
#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() {
      public void actionPerformed(ActionEvent e) {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println("InitialDelay(1000)");
        if(arrowButton!=null && arrowButton.getModel().isPressed() && autoRepeatTimer.isRunning()) {
        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() {
      public void popupMenuCanceled(PopupMenuEvent e) {}
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
      @Override public void popupMenuCanceled(PopupMenuEvent e) {}
      @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
      @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        if(arrowButton!=null) {
          arrowButton.setSelected(false);
        }
      }
    });
  }
  public void actionPerformed(ActionEvent e) {
  @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();
    }
  }
  public void mousePressed(MouseEvent e) {
  @Override public void mousePressed(MouseEvent e) {
    System.out.println("mousePressed");
    if(SwingUtilities.isLeftMouseButton(e) && e.getComponent().isEnabled()) {
      arrowButton = (AbstractButton)e.getSource();
      autoRepeatTimer.start();
    }
  }
  public void mouseReleased(MouseEvent e) {
  @Override public void mouseReleased(MouseEvent e) {
    autoRepeatTimer.stop();
  }
  public void mouseExited(MouseEvent e) {
  @Override public void mouseExited(MouseEvent e) {
    if(autoRepeatTimer.isRunning()) {
      autoRepeatTimer.stop();
    }
  }
  public void mouseEntered(MouseEvent e) {}
  public void mouseClicked(MouseEvent e) {}
  @Override public void mouseEntered(MouseEvent e) {}
  @Override public void mouseClicked(MouseEvent e) {}
}
}}

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

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

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