Swing/DisableRightButtonFloating のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DisableRightButtonFloating へ行く。
- category: swing folder: DisableRightButtonFloating title: JToolBarの右マウスボタンでのドラッグアウトを無効にする tags: [JToolBar, JLayer] author: aterai pubdate: 2022-07-11T02:40:01+09:00 description: JToolBarのドラッグアウト開始を左マウスボタンでのみ可能になるよう制限します。 image: https://drive.google.com/uc?id=12XVKQQIGqcIDa8p5FfEPfvHJTTZ9qyMn
概要
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
を設定するとドラッグで配置を変更したときに例外が発生するので、親の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(); } } } }