Swing/DisableInputLayer のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DisableInputLayer へ行く。
- 1 (2012-12-16 (日) 01:42:25)
- 2 (2014-06-06 (金) 16:53:56)
- 3 (2014-06-16 (月) 18:12:35)
- 4 (2014-11-06 (木) 01:38:55)
- 5 (2015-11-27 (金) 17:46:21)
- 6 (2016-06-01 (水) 18:42:18)
- 7 (2017-09-06 (水) 14:00:13)
- 8 (2018-12-27 (木) 16:39:27)
- 9 (2020-11-25 (水) 00:54:06)
- 10 (2023-02-14 (火) 12:25:09)
- 11 (2025-01-03 (金) 08:57:02)
- 12 (2025-01-03 (金) 09:01:23)
- 13 (2025-01-03 (金) 09:02:38)
- 14 (2025-01-03 (金) 09:03:21)
- 15 (2025-01-03 (金) 09:04:02)
- category: swing
folder: DisableInputLayer
title: JLayerで指定したコンポーネントへの入力を禁止
tags: [JLayer, GlassPane, InputEvent, JComponent]
author: aterai
pubdate: 2011-10-10T19:26:38+09:00
description: JDK 7で導入されたJLayerを利用して指定したコンポーネントへの入力を禁止します。
image:
概要
JDK 7
で導入されたJLayer
を利用して指定したコンポーネントへの入力を禁止します。
Screenshot

Advertisement
サンプルコード
class DisableInputLayerUI extends LayerUI<JPanel> {
private static final String CMD_REPAINT = "repaint";
private boolean isRunning;
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
if (!isRunning) {
return;
}
Graphics2D g2 = (Graphics2D) g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f));
g2.setPaint(Color.GRAY);
g2.fillRect(0, 0, c.getWidth(), c.getHeight());
g2.dispose();
}
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
JLayer jlayer = (JLayer) c;
jlayer.getGlassPane().setCursor(
Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
jlayer.setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.KEY_EVENT_MASK
| AWTEvent.FOCUS_EVENT_MASK | AWTEvent.COMPONENT_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override public void eventDispatched(AWTEvent e, JLayer<? extends JPanel> l) {
if (isRunning && e instanceof InputEvent) {
((InputEvent) e).consume();
}
}
public void start() {
if (isRunning) {
return;
}
isRunning = true;
firePropertyChange(CMD_REPAINT, false, true);
}
public void stop() {
isRunning = false;
firePropertyChange(CMD_REPAINT, true, false);
}
@Override public void applyPropertyChange(PropertyChangeEvent pce, JLayer<? extends JPanel> l) {
String cmd = pce.getPropertyName();
if (CMD_REPAINT.equals(cmd)) {
l.getGlassPane().setVisible((Boolean) pce.getNewValue());
l.repaint();
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JLayer
を設定した任意のコンポーネントへの入力可・不可を切り替えることができます。
- 入力禁止中に半透明グレー表示
LayerUI<JPanel>#paint(...)
をオーバーライドして表示を変更
- マウス、キー入力の禁止
LayerUI<JPanel>#eventDispatched(...)
をオーバーライドして((InputEvent) e).consume()
を使用しイベントを消費
- マウスカーソルを砂時計に変更
Cursor.WAIT_CURSOR
を設定したGlassPane
の表示を切り替える