Summary
JToolBarのドラッグアウト開始を左マウスボタンでのみ可能になるよう制限します。
Screenshot

Advertisement
Source Code Examples
class DockingListener2 extends MouseInputAdapter {
private final JToolBar toolBar;
private final MouseInputListener listener;
protected DockingListener2(JToolBar toolBar, MouseInputListener listener) {
super();
this.toolBar = toolBar;
this.listener = listener;
}
private boolean cancelDrag(MouseEvent e) {
return !toolBar.isEnabled() || !SwingUtilities.isLeftMouseButton(e);
}
@Override public void mousePressed(MouseEvent e) {
if (cancelDrag(e)) {
return;
}
listener.mousePressed(e);
}
@Override public void mouseDragged(MouseEvent e) {
if (cancelDrag(e)) {
return;
}
listener.mouseDragged(e);
}
@Override public void mouseReleased(MouseEvent e) {
if (cancelDrag(e)) {
return;
}
listener.mouseReleased(e);
}
}
View in GitHub: Java, KotlinDescription
Default- デフォルトの
JToolBarは左マウスボタンだけでなく右・中マウスボタンのクリックでもドラッグアウト開始が可能 - このため
WindowsLookAndFeel環境などでJToolBarにJPopupMenuを設定して右マウスボタンでドラッグアウトするとJToolBarは元の位置に残ったままドラッグ中のJWindowも表示され続ける状態になる- 再度左マウスボタンで
JToolBarをドラッグアウトし直さないとドラッグ中のJWindowを非表示に戻せないバグ?
- 再度左マウスボタンで
- デフォルトの
Override createDockingListener()BasicToolBarUI#createDockingListener()をオーバーライドして右マウスボタンでのドラッグアウトはキャンセルするよう設定- このサンプルでは
BasicToolBarUIをJToolBarに設定しているので、子のJButtonのLookAndFeelがデフォルトのJToolBarに配置したJButtonとは異なる描画になっている
DisableRightButtonDraggedOutJLayerを使用して右マウスボタンでのドラッグアウトはキャンセルするよう設定JToolBarに直接JLayerを設定するとドラッグで配置を変更したときに例外が発生するので、JToolBarの親JPanelにJLayerを設定する必要がある- このサンプルでは
JToolBarの名前がDisableRightButtonDraggedOutと一致する場合のみ右マウスボタンでのドラッグアウトを無効化している - 左マウスボタンでドラッグアウトを開始して右マウスボタンをプレス、左マウスボタンをリリース、右マウスボタンをリリースするとデフォルトの
JToolBarと同様に非表示化できないドラッグ中のJWindowが生成されてしまうclass DisableRightButtonDragOutLayerUI extends LayerUI<JPanel> { @Override public void installUI(JComponent c) { super.installUI(c); if (c instanceof JLayer) { ((JLayer<?>) c).setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK); } } @Override public void uninstallUI(JComponent c) { if (c instanceof JLayer) { ((JLayer<?>) c).setLayerEventMask(0); } super.uninstallUI(c); } @Override protected void processMouseMotionEvent( MouseEvent e, JLayer<? extends JPanel> l) { Component c = e.getComponent(); if (c instanceof JToolBar) { boolean dragEvent = e.getID() == MouseEvent.MOUSE_DRAGGED; boolean leftButton = SwingUtilities.isLeftMouseButton(e); boolean checkName = "DisableRightButtonDraggedOut".equals(c.getName()); if (dragEvent && !leftButton && checkName) { e.consume(); } } } }