TITLE:JToolBarでアイコンボタンを右寄せ
#navi(../)
RIGHT:Posted by [[aterai]] at 2006-01-23
*JToolBarでアイコンボタンを右寄せ [#dca938c3]
JToolBarでアイコンボタンを右寄せ、下寄せで表示します。

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

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTVb-HPZjI/AAAAAAAAAno/dMILsHzlipk/s800/ToolBarLayout.png)

**サンプルコード [#z8d01839]
#code{{
String path = "/toolbarButtonGraphics/general/";
URL url1 = getClass().getResource(path+"Copy24.gif");
URL url2 = getClass().getResource(path+"Cut24.gif");
URL url3 = getClass().getResource(path+"Help24.gif");
toolbar.add(createToolbarButton(url1));
toolbar.add(createToolbarButton(url2));
toolbar.add(Box.createGlue());
toolbar.add(createToolbarButton(url3));
}}
#code{{
private static JButton createToolbarButton(URL url) {
  JButton b = new JButton(new ImageIcon(url));
  b.setRequestFocusEnabled(false);
  return b;
}
}}


**解説 [#u7eef7af]
JToolBarのデフォルトレイアウトはBoxLayoutなので、Box.createGlueをアイコンボタンの間に挟むことで右寄せをしています。

ボタンとボタンの間隔を固定値で空けたい場合は、Box.createRigidAreaを使用します。Box.createHorizontalStrutやBox.createVerticalStrutを使うとツールバーが水平垂直に切り替わった時に、余計な余白が出来てしまうことがあります。

%%ツールバーが垂直になった場合のことも考えて、VerticalGlueも一緒に挿入していますが、特に問題ないようです。%%

アイコンは、[http://java.sun.com/developer/techDocs/hi/repository/ Java look and feel Graphics Repository]のjlfgr-1_0.jarから読み込んでいます。

----
%%JDK 1.6 で、JDK 1.5 のようなボタン表示(フォーカスが無い状態)にするには、以下のようなリスナーを追加して描画し直す必要があるようです。%%
//- 以下、[http://forums.sun.com/thread.jspa?threadID=5254287 Swing - Buttons like Netbeans']にある、Yezdi さんの投稿(2008/01/15 8:48)より引用
//
//#code{{
//class ToolBarButton extends JButton {
//  public ToolBarButton(ImageIcon icon) {
//    super(icon);
//    setContentAreaFilled(false);
//    setFocusPainted(false);
//    addMouseListener(new MouseAdapter() {
//      public void mouseEntered(MouseEvent me) {
//        setContentAreaFilled(true);
//      }
//      public void mouseExited(MouseEvent me) {
//        setContentAreaFilled(false);
//      }
//    });
//  }
//}
//}}

//#screenshot(,screenshot1.png)
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTVeG6fVBI/AAAAAAAAAns/II_0GGIdnNk/s800/ToolBarLayout1.png)

JDK 1.6 で、JDK 1.5 のようなボタン表示(フォーカスが無い状態)にするには、JButton#setRequestFocusEnabled(false);、または、JButton#setFocusable(false); とする必要があるようです。
- よく考えれば、ツールバーのボタンが、Focusableになっていると色々面倒…
-- コピーボタンを押したらテキストエディタの選択状態が消えたり、参考の質問のような不具合が起こるなど
- 参考
-- [http://forums.sun.com/thread.jspa?threadID=5342343 Swing - JTextPane selection color problem]の camickr さんの投稿(2008/10/25 0:34)
-- %JAVA_HOME%\demo\jfc\Notepad\src\Notepad.java

**参考リンク [#waff2dd4]
-[http://java.sun.com/developer/techDocs/hi/repository/ Java look and feel Graphics Repository]
- [http://forums.sun.com/thread.jspa?threadID=5254287 Swing - Buttons like Netbeans']

**コメント [#me4d31ab]
- 環境によって、上記のサンプルが右寄せにならない場合もあるようです。 -- [[aterai]] &new{2006-03-22 (水) 15:58:10};
- setRequestFocusEnabled(false)、スクリーンショット更新。 -- [[aterai]] &new{2008-10-27 (月) 15:20:38};

#comment