Swing/DisableInputLayer のバックアップ差分(No.4)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DisableInputLayer へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JLayerで指定したコンポーネントへの入力を禁止 #navi(../) #tags(JLayer, GlassPane, InputEvent, JComponent) RIGHT:Posted by &author(aterai); at 2011-10-10 * JLayerで指定したコンポーネントへの入力を禁止 [#w352f05c] --- title: JLayerで指定したコンポーネントへの入力を禁止 tags: [JLayer, GlassPane, InputEvent, JComponent] author: aterai pubdate: 2011-10-10T19:26:38+09:00 description: JDK 7で導入された、JLayerを利用して、指定したコンポーネントへの入力を禁止します。 --- * 概要 [#w352f05c] `JDK 7`で導入された、`JLayer`を利用して、指定したコンポーネントへの入力を禁止します。 #download #ref(https://lh3.googleusercontent.com/-fJbneWE3WB4/TpLGoNbk1TI/AAAAAAAABDk/GJWfhRR4UB0/s800/DisableInputLayer.png) #download(https://lh3.googleusercontent.com/-fJbneWE3WB4/TpLGoNbk1TI/AAAAAAAABDk/GJWfhRR4UB0/s800/DisableInputLayer.png) ** サンプルコード [#tf3ec0e6] * サンプルコード [#tf3ec0e6] #code(link){{ class DisableInputLayerUI extends LayerUI<JPanel> { private boolean isRunning = false; @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); JLayer jlayer = (JLayer)c; jlayer.getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); jlayer.setLayerEventMask( AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); 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) { JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask(0); super.uninstallUI(c); } @Override public void eventDispatched(AWTEvent e, JLayer l) { if(isRunning && e instanceof InputEvent) { ((InputEvent)e).consume(); } } private static final String CMD_REPAINT = "repaint"; 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 l) { String cmd = pce.getPropertyName(); if(CMD_REPAINT.equals(cmd)) { l.getGlassPane().setVisible((Boolean)pce.getNewValue()); l.repaint(); } } } }} ** 解説 [#o39441f7] * 解説 [#o39441f7] 上記のサンプルでは、`JLayer`を設定した任意のコンポーネントへの入力可不可を切り替えることができるようになっています。 - 入力禁止中の半透明グレー表示 -- `LayerUI<JPanel>#paint(...)`をオーバーライドして表示を変更 - マウス、キー入力の禁止 -- `LayerUI<JPanel>#eventDispatched(...)`をオーバーライドして、`((InputEvent)e).consume()`を使用し、イベントを消費 - マウスカーソルを砂時計に変更 -- `Cursor.WAIT_CURSOR`を設定した`GlassPane`の表示を切り替える ** 参考リンク [#b84b11fe] * 参考リンク [#b84b11fe] - [[Cursorを砂時計に変更>Swing/WaitCursor]] ** コメント [#md12fb14] * コメント [#md12fb14] #comment #comment