TITLE:JToggleButtonからポップアップメニューを開く

Posted by aterai at 2006-07-10

JToggleButtonからポップアップメニューを開く

クリックするとポップアップメニューを表示するJToggleButtonを作成し、これをツールバーに追加します。

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

サンプルコード

class MenuArrowIcon implements Icon {
  public void paintIcon(Component c, Graphics g, int x, int y) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setPaint(Color.BLACK);
    g2.translate(x,y);
    g2.drawLine( 2, 3, 6, 3 );
    g2.drawLine( 3, 4, 5, 4 );
    g2.drawLine( 4, 5, 4, 5 );
    g2.translate(-x,-y);
  }
  public int getIconWidth()  { return 9; }
  public int getIconHeight() { return 9; }
}
class MenuToggleButton extends JToggleButton {
  private static final Icon i = new MenuArrowIcon();
  public MenuToggleButton() {
    this("", null);
  }
  public MenuToggleButton(Icon icon) {
    this("", icon);
  }
  public MenuToggleButton(String text) {
    this(text, null);
  }
  public MenuToggleButton(String text, Icon icon) {
    super();
    Action a = new AbstractAction(text) {
      public void actionPerformed(ActionEvent ae) {
        MenuToggleButton b = (MenuToggleButton)ae.getSource();
        if(pop!=null) pop.show(b, 0, b.getHeight());
      }
    };
    a.putValue(Action.SMALL_ICON, icon);
    setAction(a);
    setFocusable(false);
    setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4+i.getIconWidth()));
  }
  protected JPopupMenu pop;
  public void setPopupMenu(final JPopupMenu pop) {
    this.pop = pop;
    pop.addPopupMenuListener(new PopupMenuListener() {
      public void popupMenuCanceled(PopupMenuEvent e) {}
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        setSelected(false);
      }
    });
  }
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Dimension dim = getSize();
    Insets ins = getInsets();
    int x = dim.width-ins.right;
    int y = ins.top+(dim.height-ins.top-ins.bottom-i.getIconHeight())/2;
    i.paintIcon(this, g, x, y);
  }
}

解説

上記のサンプルでは、JToggleButtonの右側に余白を設定して、そこに下向きの矢印を上書きしています。

参考リンク

コメント

  • いつもお世話になっております。JToggleButtonをOn/Off時、背景色を変える方法はありますか?jToggleButton.setBackground(Color.RED);で試してみましたが、色変化はありませんでした。ご教示、よろしくお願いいたします -- Panda
  • こんばんは。JToggleButton#setBackground(Color)は、LookAndFeelによっては適用されない場合があります。このため、独自のToggleButtonUIを用意したり、例えば以下のような方法を使用する必要があります。 -- aterai
    • 例1: 文字列から背景色、縁などのすべてを含めたアイコンを用意してsetSelectedIconで設定する
    • 例2: setContentAreaFilled(false);として、自前で選択時の背景を描画する
      JToggleButton button = new JToggleButton("text", icon) {
        @Override public void paintComponent(Graphics g) {
          if(getModel().isSelected()) {
            Graphics2D g2 = (Graphics2D)g.create();
            g2.setColor(getBackground());
            g2.fillRoundRect(0,0,getWidth(),getHeight(),4,4);
            g2.dispose();
          }
          super.paintComponent(g);
          //......
        }
      };
      button.setBackground(Color.RED);
      button.setContentAreaFilled(false);