Swing/PopupMenuBlockLayer のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- category: swing folder: PopupMenuBlockLayer title: JLayerで子コンポーネントへの入力を制限する tags: [JLayer, GlassPane, JScrollPane, JComponent] author: aterai pubdate: 2011-11-28T15:32:54+09:00 description: JLayerを使って、子コンポーネントへのすべての入力を制限します。 image:
概要
JLayer
を使って、子コンポーネントへのすべての入力を制限します。
Screenshot
Advertisement
サンプルコード
class DisableInputLayerUI extends LayerUI<JComponent> {
private static final String CMD_REPAINT = "lock";
private final transient MouseAdapter dummyMouseListener = new MouseAdapter() {};
private boolean isBlocking;
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
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) {
if (c instanceof JLayer) {
JLayer jlayer = (JLayer) c;
jlayer.setLayerEventMask(0);
jlayer.getGlassPane().removeMouseListener(dummyMouseListener);
}
super.uninstallUI(c);
}
@Override public void eventDispatched(AWTEvent e, JLayer<? extends JComponent> l) {
if (isBlocking && e instanceof InputEvent) {
((InputEvent) e).consume();
}
}
public void setLocked(boolean flag) {
firePropertyChange(CMD_REPAINT, isBlocking, flag);
isBlocking = flag;
}
@Override public void applyPropertyChange(PropertyChangeEvent pce, JLayer<? extends JComponent> l) {
String cmd = pce.getPropertyName();
if (CMD_REPAINT.equals(cmd)) {
l.getGlassPane().setVisible((Boolean) pce.getNewValue());
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JLayer
を使用して、JScrollBar
の移動、JTable
のセル選択、JToolTip
の表示、JTableHeader
の移動など、子コンポーネントに対するすべての入力をまとめて制限しています。
- JScrollPaneのスクロールを禁止のように、
JScrollPane
、JTable
などを個別に入力禁止にする必要がない - JLayerで指定したコンポーネントへの入力を禁止とほとんど同じだが、その場合、
setComponentPopupMenu(...)
で設定したJPopupMenu
が制限できないJLayer#setLayerEventMask(...)
でポップアップメニュー表示の入力イベントが取得できない?(Windows7
、JDK 1.7.0_01
)ため、Cursorを砂時計に変更のようにGlassPane
にダミーのマウスリスナーを追加してポップアップメニューの表示トリガーを無視することで対応