• 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

概要

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

サンプルコード

toolbar.setUI(new BasicToolBarUI() {
  @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;
    if (p.x >= c.getWidth() - iv) {
      return false;
    } else if (p.x < iv) {
      return false;
    } else {
      return true;
    }
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JToolBarは上下にのみドッキングできるようになっているため、JComboBoxのような横長のコンポーネントを配置している場合でもレイアウトが崩れにくくなっています。

ToolBarUI#canDock(Component, Point)メソッドをオーバーライドして、左右の場合はfalseを返すようにしています。

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


BorderLayoutWESTEASTに、適当なダミーコンポーネント(例えばサイズ0Box)を配置するだけで、LookAndFeelを変更しなくてもドッキングを制限することができます。

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);

コメント