• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JToolBarのドッキングを上下のみに制限
#navi(../)
*JToolBarのドッキングを上下のみに制限 [#sa3c56e1]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-09-18~
更新日:&lastmod;
---
category: swing
folder: DockingConstraint
title: JToolBarのドッキングを上下のみに制限
tags: [JToolBar, BorderLayout]
author: aterai
pubdate: 2006-09-18T18:01:15+09:00
description: JToolBarのドッキングを上下のみに制限して、左右を無視するように設定します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTLq6lRV0I/AAAAAAAAAX8/dKnoZJh1xrM/s800/DockingConstraint.png
---
* 概要 [#summary]
`JToolBar`のドッキングを上下のみに制限して、左右を無視するように設定します。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTLq6lRV0I/AAAAAAAAAX8/dKnoZJh1xrM/s800/DockingConstraint.png)

**概要 [#gf7f68c7]
JToolBarのドッキングを上下のみに制限して、左右を無視するように設定します。

#screenshot

**サンプルコード [#v04d7b69]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
toolbar.setUI(new BasicToolBarUI() {
  public boolean canDock(Component c, Point p) {
  @Override public boolean canDock(Component c, Point p) {
    return super.canDock(c, p) ? isHorizontalDockingConstraint(c, p) : false;
  }

  private boolean isHorizontalDockingConstraint(Component c, Point p) {
    if (!c.contains(p)) return false;
    int iv = (toolBar.getOrientation() == JToolBar.HORIZONTAL)
                  ? toolBar.getSize().height
                  : toolBar.getSize().width;
    int iv = toolBar.getOrientation() == JToolBar.HORIZONTAL
               ? toolBar.getSize().height
               : toolBar.getSize().width;
    if (p.x >= c.getWidth() - iv) {
      return false;
    }else if (p.x < iv) {
    } else if (p.x < iv) {
      return false;
    }else{
    } else {
      return true;
    }
  }
});
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#f1439991]
上記のサンプルでは、JToolBarは上下のみドッキングできるようになっているため、JComboBoxのような横長のコンポーネントを配置している場合でもレイアウトが崩れにくくなっています。
* 解説 [#explanation]
- `ToolBarUI#canDock(Component, Point)`メソッドをオーバーライドして左右の場合は`false`を返すよう設定
-- このため`JToolBar`は上下にのみドッキング可能になるよう制限され、横長の`JComboBox`などのコンポーネントを配置した`JToolBar`が左右に配置されてレイアウトが崩れる心配がない
- ドッキングできるかどうかを判定している`BasicToolBarUI#getDockingConstraint`メソッドが`private`のため、サンプルコードではこれをコピーしてすこしだけ条件を変更した`isHorizontalDockingConstraint`メソッドを作成して使用
- `BorderLayout`の`WEST`と`EAST`に、たとえばサイズ`0`の`Box`や空の`JLabel`などの適当な非表示コンポーネントを配置すると`LookAndFeel`の変更なしでドッキングの制限が可能になる
#code{{
JPanel panel = new JPanel(new BorderLayout());
panel.add(toolbar, BorderLayout.NORTH);
panel.add(Box.createRigidArea(new Dimension()), BorderLayout.WEST);
panel.add(Box.createRigidArea(new Dimension()), BorderLayout.EAST);
}}

ToolBarUI#canDock(Component, Point) メソッドをオーバーライドして、左右の場合はfalseを返すようにしています。
* 参考リンク [#reference]
[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/basic/BasicToolBarUI.html#canDock-java.awt.Component-java.awt.Point- BasicToolBarUI#canDock(...) (Java Platform SE 8)]

ドッキングできるかどうかを判定しているBasicToolBarUIのgetDockingConstraintメソッドがprivateのため、サンプルコードでは、これコピーしてすこしだけ条件を変更したisHorizontalDockingConstraintメソッドを作成しています。

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