• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JToolBarでアイコンボタンを右寄せ
#navi(../)
*JToolBarでアイコンボタンを右寄せ [#dca938c3]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-01-23~
更新日:&lastmod;
---
category: swing
folder: ToolBarLayout
title: JToolBarでアイコンボタンを右寄せ
tags: [JToolBar, JMenuBar, BoxLayout, JButton, Focus]
author: aterai
pubdate: 2006-01-23T14:20:11+09:00
description: JToolBarでアイコンボタンを右寄せ、下寄せで表示します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTVb-HPZjI/AAAAAAAAAno/dMILsHzlipk/s800/ToolBarLayout.png
---
* 概要 [#summary]
`JToolBar`でアイコンボタンを右寄せ、下寄せで表示します。

#contents
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTVb-HPZjI/AAAAAAAAAno/dMILsHzlipk/s800/ToolBarLayout.png)

**概要 [#r2fc1a5c]
JToolBarでアイコンボタンを右寄せ、下寄せで表示します。

#screenshot

**サンプルコード [#z8d01839]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
// jlfgr-1_0.jar
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(new JButton(new ImageIcon(url1)));
toolbar.add(new JButton(new ImageIcon(url2)));
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(new JButton(new ImageIcon(url3)));
toolbar.add(createToolbarButton(url3));
// ...
private static JButton createToolbarButton(URL url) {
  JButton b = new JButton(new ImageIcon(url));
  b.setRequestFocusEnabled(false);
  // or: b.setFocusPainted(false);
  return b;
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#u7eef7af]
JToolBarはデフォルトの場合、BoxLayoutを使用するので、Box.createGlueをアイコンボタンの間に挟むことで右寄せをしています。
* 解説 [#explanation]
- `JToolBar`や`JMenuBar`のデフォルトレイアウトは`BoxLayout`のため`Box.createGlue()`を間に挟むことでボタンやメニューの右寄せが可能
- ボタンとボタンの間隔を固定値で空けたい場合は`Box.createRigidArea`を使用する
-- `Box.createHorizontalStrut(...)`や`Box.createVerticalStrut(...)`を使うとツールバーの水平・垂直が切り替わった時に余計な余白が発生する場合がある
- 各アイコンは[http://web.archive.org/web/20120818143859/http://java.sun.com/developer/techDocs/hi/repository/ Java look and feel Graphics Repository]の`jlfgr-1_0.jar`がクラスパス内に存在する場合はそこから読み込んでいる

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

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

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

----
JDK 6 で、JDK 5 のようなボタン表示にするには、以下のようなリスナを追加して描画し直す必要があるようです。
- [[Swing - Buttons like Netbeans'>http://forum.java.sun.com/thread.jspa?threadID=5254287]]
- `JDK 1.6`と`JDK 1.5`で`JToolBar`に配置したボタン表示が異なる?
-- `JComponent#setRequestFocusEnabled(false)`(マウスクリックではフォーカスを取得しないがキーボードからは許可)、または`AbstractButton#setFocusable(false)`と設定すると同一になる

#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);
      }
    });
  }
}
}}
#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTVeG6fVBI/AAAAAAAAAns/II_0GGIdnNk/s800/ToolBarLayout1.png)

**参考リンク [#waff2dd4]
-[[Java look and feel Graphics Repository>http://java.sun.com/developer/techDocs/hi/repository/]]
- [[Swing - Buttons like Netbeans'>http://forum.java.sun.com/thread.jspa?threadID=5254287]]
- マウスクリックでツールバーボタンにフォーカスが移動すると、コピーボタンを押したらテキストエディタでの文字列選択状態がクリアされたり、参考の質問のような不具合が起こる
- 参考: [https://community.oracle.com/thread/1358842 Swing - JTextPane selection color problem]の camickr さんの投稿(2008/10/25 0:34)
- `%JAVA_HOME%/demo/jfc/Notepad/src/Notepad.java`

**コメント [#me4d31ab]
- 環境によって、上記のサンプルが右寄せにならない場合もあるようです。 -- [[terai]] &new{2006-03-22 (水) 15:58:10};
* 参考リンク [#reference]
- [http://web.archive.org/web/20120818143859/http://java.sun.com/developer/techDocs/hi/repository/ Java look and feel Graphics Repository]
- [https://community.oracle.com/thread/1365522 Swing - Buttons like Netbeans']
- [https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#custom Customizing Menu Layout - How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#setRequestFocusEnabled-boolean- JComponent#setRequestFocusEnabled(boolean) (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/AbstractButton.html#setFocusPainted-boolean- AbstractButton#setFocusPainted(boolean) (Java Platform SE 8)]

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

#comment