Swing/PopupMenuBlockLayer のバックアップソース(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/PopupMenuBlockLayer へ行く。
- 1 (2011-11-28 (月) 15:32:54)
- 2 (2011-11-28 (月) 20:14:40)
- 3 (2011-11-29 (火) 17:16:11)
- 4 (2012-12-15 (土) 04:32:28)
- 5 (2013-08-17 (土) 00:55:30)
- 6 (2015-02-03 (火) 16:18:46)
- 7 (2015-11-27 (金) 17:45:34)
- 8 (2017-05-26 (金) 16:38:45)
- 9 (2018-05-16 (水) 20:21:16)
- 10 (2020-05-06 (水) 18:52:33)
- 11 (2021-11-02 (火) 02:31:07)
- 12 (2022-08-18 (木) 02:57:52)
- 13 (2024-01-17 (水) 11:17:25)
- 14 (2024-02-02 (金) 12:22:45)
TITLE:JLayerで子コンポーネントへの入力を制限する #navi(../) RIGHT:Posted by &author(aterai); at 2011-11-28 *JLayerで子コンポーネントへの入力を制限する [#p53eaa44] JLayerを使って、子コンポーネントへのすべての入力を制限します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(https://lh5.googleusercontent.com/-Svne2X0djJ8/TtJGGlPU-OI/AAAAAAAABFM/xjZfqHHbkJ0/s800/PopupMenuBlockLayer.png) **サンプルコード [#p31bbd51] #code(link){{ class DisableInputLayerUI extends LayerUI<JComponent> { private static final MouseAdapter dummyMouseListener = new MouseAdapter() {}; private boolean isBlocking = false; @Override public void installUI(JComponent c) { super.installUI(c); JLayer jlayer = (JLayer)c; jlayer.getGlassPane().addMouseListener(dummyMouseListener); jlayer.setLayerEventMask( AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); } @Override public void uninstallUI(JComponent c) { JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask(0); jlayer.getGlassPane().removeMouseListener(dummyMouseListener); super.uninstallUI(c); } @Override public void eventDispatched(AWTEvent e, JLayer l) { if(isBlocking && e instanceof InputEvent) { ((InputEvent)e).consume(); } } private static final String CMD_REPAINT = "lock"; public void setLocked(boolean flag) { firePropertyChange(CMD_REPAINT,isBlocking,flag); isBlocking = flag; } @Override public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) { String cmd = pce.getPropertyName(); if(CMD_REPAINT.equals(cmd)) { l.getGlassPane().setVisible((Boolean)pce.getNewValue()); } } } }} **解説 [#qb9093db] 上記のサンプルでは、JLayerを使って、JScrollPane(JScrollBar)のスクロール、JTableのセル選択、JToolTip、JTableHeaderの移動など、子コンポーネントへのすべての入力をまとめて制限しています。 - [[JScrollPaneのスクロールを禁止>Swing/DisableScrolling]]のように、JScrollPane、JTableなどを個別に入力禁止にする必要がない - [[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]]と、ほとんど同じだが、その場合、setComponentPopupMenu(...)で設定したJPopupMenuが制限できない -- JLayer#setLayerEventMask(...)でポップアップメニュー表示の入力イベントが取得できない?(Windows7, JDK 1.7.0_01) -- [[Cursorを砂時計に変更>Swing/WaitCursor]]のように、GlassPaneにダミーのマウスリスナーを追加してポップアップメニューの表示トリガーを無視する **参考リンク [#r3e1e146] - [[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]] - [[JScrollPaneのスクロールを禁止>Swing/DisableScrolling]] - [[Cursorを砂時計に変更>Swing/WaitCursor]] **コメント [#u010a713] - またsrc.zipなどを上げ忘れていたので修正。 -- [[aterai]] &new{2011-11-29 (火) 17:16:11}; #comment