Swing/DisableInputLayer の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DisableInputLayer へ行く。
- Swing/DisableInputLayer の差分を削除
--- 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を利用して、指定したコンポーネントへの入力を禁止します。 description: JDK 7で導入されたJLayerを利用して指定したコンポーネントへの入力を禁止します。 image: https://lh3.googleusercontent.com/-fJbneWE3WB4/TpLGoNbk1TI/AAAAAAAABDk/GJWfhRR4UB0/s800/DisableInputLayer.png --- * 概要 [#summary] `JDK 7`で導入された、`JLayer`を利用して、指定したコンポーネントへの入力を禁止します。 `JDK 7`で導入された`JLayer`を利用して指定したコンポーネントへの入力を禁止します。 #download(https://lh3.googleusercontent.com/-fJbneWE3WB4/TpLGoNbk1TI/AAAAAAAABDk/GJWfhRR4UB0/s800/DisableInputLayer.png) * サンプルコード [#sourcecode] #code(link){{ 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(); } } } }} * 解説 [#explanation] 上記のサンプルでは、`JLayer`を設定した任意のコンポーネントへの入力可・不可を切り替えることができます。 - 入力禁止中に半透明グレー表示 -- `LayerUI<JPanel>#paint(...)`をオーバーライドして表示を変更 - マウス、キー入力の禁止 -- `LayerUI<JPanel>#eventDispatched(...)`をオーバーライドして`((InputEvent) e).consume()`を使用しイベントを消費 - マウスカーソルを砂時計に変更 -- `Cursor.WAIT_CURSOR`を設定した`GlassPane`の表示を切り替える * 参考リンク [#reference] - [[Cursorを砂時計に変更>Swing/WaitCursor]] * コメント [#comment] #comment #comment