Swing/DisableRightButtonFloating のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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
を設定するとドラッグで配置を変更したときに例外が発生するので、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(); } } } }