概要
JToolBar
が移動可能な場合にBorder
として表示されるドラッグアイコンを変更します。
Screenshot
Advertisement
サンプルコード
class ToolBarDragBorder extends MetalBorders.ToolBarBorder {
private static final Icon DRAG_ICON = new ToolBarDragIcon();
@Override public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
if (!(c instanceof JToolBar)) {
return;
}
JToolBar tb = (JToolBar) c;
if (tb.isFloatable()) {
if (tb.getOrientation() == HORIZONTAL) {
int cy = (h - DRAG_ICON.getIconHeight()) / 2;
DRAG_ICON.paintIcon(c, g, x, y + cy);
} else { // vertical
super.paintBorder(c, g, x, y, w, h);
}
}
}
}
class ToolBarDragIcon implements Icon {
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(x, y);
g2.setPaint(Color.GRAY);
int x2 = getIconWidth() / 2 - 1;
int y2 = getIconHeight() / 2 - 1;
g2.fillRect(x2, y2 - 6, 2, 2);
g2.fillRect(x2, y2 - 2, 2, 2);
g2.fillRect(x2, y2 + 2, 2, 2);
g2.fillRect(x2, y2 + 6, 2, 2);
g2.dispose();
}
@Override public int getIconWidth() {
return 14;
}
@Override public int getIconHeight() {
return 16;
}
}
View in GitHub: Java, Kotlin解説
- 下:
- デフォルト
- ツールバーのドラッグ用アイコンは
LookAndFeel
依存 UIManager.put("ToolBar.border", ...)
などで変更可能WindowsLookAndFeel
ではJToolBar
の余白をどこでもドラッグして移動可能だが、MetalLookAndFeel
ではドラッグ用アイコン上のみドラッグ可能- ただしそのドラッグ可能領域の幅は
MetalToolBarUI.MetalDockingListener
で14px
にハードコーディングされているため、MetalBorders.ToolBarBorder#getBorderInsets(...)
をオーバーライドしても領域の幅などは変更されない
- ただしそのドラッグ可能領域の幅は
- 上:
MetalBorders.ToolBarBorder
のpaintBorder(...)
メソッドをオーバーライドしてツールバーの方向が水平の場合、ドラッグ用の独自アイコン(4
点)を描画JToolBar#getComponentOrientation()#isLeftToRight() == false
の場合に未対応- ツールバーの方向が垂直の場合は元の
MetalLookAndFeel
のToolBarBorder
を使用