TITLE:JPopupMenuをボタンの長押しで表示

Posted by aterai at 2009-01-26

JPopupMenuをボタンの長押しで表示

JToolBarに、長押しでJPopupMenu、クリックで選択されたメニューを表示するボタンを追加します。

  • &jnlp;
  • &jar;
  • &zip;
PressAndHoldButton.png

サンプルコード

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) {
        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() {
      public void popupMenuCanceled(PopupMenuEvent e) {}
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        if(arrowButton!=null) {
          arrowButton.setSelected(false);
        }
      }
    });
  }
  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) {
    System.out.println("mousePressed");
    if(SwingUtilities.isLeftMouseButton(e) && e.getComponent().isEnabled()) {
      arrowButton = (AbstractButton)e.getSource();
      autoRepeatTimer.start();
    }
  }
  public void mouseReleased(MouseEvent e) {
    autoRepeatTimer.stop();
  }
  public void mouseExited(MouseEvent e) {
    if(autoRepeatTimer.isRunning()) {
      autoRepeatTimer.stop();
    }
  }
  public void mouseEntered(MouseEvent e) {}
  public void mouseClicked(MouseEvent e) {}
}

解説

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


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

コメント