Swing/PopupMenuBlockLayer のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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で子コンポーネントへの入力を制限する
Posted by aterai at 2011-11-28
JLayerで子コンポーネントへの入力を制限する
JLayerを使って、子コンポーネントへのすべての入力を制限します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
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());
}
}
}
解説
上記のサンプルでは、JLayerを使って、JScrollPane(JScrollBar)のスクロール、JTableのセル選択、JToolTip、JTableHeaderの移動など、子コンポーネントへのすべての入力をまとめて制限しています。
- JScrollPaneのスクロールを禁止のように、JScrollPane、JTableなどを個別に入力禁止に設定する必要がない
- JLayerで指定したコンポーネントへの入力を禁止と、ほとんど同じだが、その場合、setComponentPopupMenu(...)で設定したJPopupMenuが制限できない。
- JLayer#setLayerEventMask(...)でポップアップメニュー表示の入力イベントが取得できない?(Windows7, JDK 1.7.0_01)
- Cursorを砂時計に変更のように、GlassPaneにダミーのマウスリスナーを追加してポップアップメニューの表示トリガーを無視する