概要
JToolBar
のドラッグアウト開始を左マウスボタンでのみ可能になるよう制限します。
Screenshot
Advertisement
サンプルコード
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, Kotlin解説
Default
- デフォルトの
JToolBar
は左マウスボタンだけでなく右・中マウスボタンのクリックでもドラッグアウト開始が可能 - このため
WindowsLookAndFeel
環境などでJToolBar
にJPopupMenu
を設定して右マウスボタンでドラッグアウトするとJToolBar
は元の位置に残ったままドラッグ中のJWindow
も表示され続ける状態になる- 再度左マウスボタンで
JToolBar
をドラッグアウトし直さないとドラッグ中のJWindow
を非表示に戻せないバグ?
- 再度左マウスボタンで
- デフォルトの
Override createDockingListener()
BasicToolBarUI#createDockingListener()
をオーバーライドして右マウスボタンでのドラッグアウトはキャンセルするよう設定- このサンプルでは
BasicToolBarUI
をJToolBar
に設定しているので、子のJButton
のLookAndFeel
がデフォルトのJToolBar
に配置したJButton
とは異なる描画になっている
DisableRightButtonDraggedOut
JLayer
を使用して右マウスボタンでのドラッグアウトはキャンセルするよう設定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(); } } } }