概要

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

解説

  • ToolBarUI#canDock(Component, Point)メソッドをオーバーライドして左右の場合はfalseを返すよう設定
    • このためJToolBarは上下にのみドッキング可能になるよう制限され、横長のJComboBoxなどのコンポーネントを配置したJToolBarが左右に配置されてレイアウトが崩れる心配がない
  • ドッキングできるかどうかを判定しているBasicToolBarUI#getDockingConstraintメソッドがprivateのため、サンプルコードではこれをコピーしてすこしだけ条件を変更したisHorizontalDockingConstraintメソッドを作成して使用
  • BorderLayoutWESTEASTに、たとえばサイズ0Boxや空のJLabelなどの適当な非表示コンポーネントを配置すると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);
    

参考リンク

BasicToolBarUI#canDock(...) (Java Platform SE 8)

コメント