Swing/DisableInputLayer のバックアップソース(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/DisableInputLayer へ行く。
TITLE:JLayerで指定したコンポーネントへの入力を禁止 #navi(../) RIGHT:Posted by &author(aterai); at 2011-10-10 *JLayerで指定したコンポーネントへの入力を禁止 [#w352f05c] JDK 7 で導入された、JLayerを利用して、指定したコンポーネントへの入力を禁止します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(https://lh3.googleusercontent.com/-fJbneWE3WB4/TpLGoNbk1TI/AAAAAAAABDk/GJWfhRR4UB0/s800/DisableInputLayer.png) **サンプルコード [#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); } @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] 上記のサンプルでは、JLayerを設定した任意のコンポーネントへの入力可不可を切り替えることができるようになっています。 -入力禁止中の半透明グレイ表示 -- LayerUI<JPanel>#paint(...)をオーバーライドして表示を変更 -マウス、キー入力の禁止 -- LayerUI<JPanel>#eventDispatched(...)をオーバーライドして、((InputEvent)e).consume()を使用し、イベントを消費 -マウスカーソルを砂時計に変更 -- Cursor.WAIT_CURSORを設定したGlassPaneの表示を切り替える **参考リンク [#b84b11fe] -[[Cursorを砂時計に変更>Swing/WaitCursor]] **コメント [#md12fb14] #comment