Swing/JLayerDisabledText のバックアップの現在との差分(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/JLayerDisabledText へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: JLayerDisabledText title: JLayerを使用して無効時のコンポーネントの文字色を変更する tags: [JLayer, GlassPane, Focus, Mnemonic, JPopupMenu, JToolTip] author: aterai pubdate: 2012-02-13T14:58:04+09:00 description: JLayerを使用して、JButtonなどのコンポーネントを無効にしたときの文字色を変更します。 image: https://lh5.googleusercontent.com/-_2bogxiuOec/TzilFn0ms8I/AAAAAAAABJI/oMz_T6SqCwE/s800/JLayerDisabledText.png --- * 概要 [#la63e3a8] * 概要 [#summary] `JLayer`を使用して、`JButton`などのコンポーネントを無効にしたときの文字色を変更します。 #download(https://lh5.googleusercontent.com/-_2bogxiuOec/TzilFn0ms8I/AAAAAAAABJI/oMz_T6SqCwE/s800/JLayerDisabledText.png) * サンプルコード [#r13095c1] * サンプルコード [#sourcecode] #code(link){{ class DisableInputLayerUI extends LayerUI<JComponent> { private static final boolean DEBUG_POPUP_BLOCK = true; private static final MouseAdapter dummyMouseListener = new MouseAdapter() {}; private static final KeyAdapter dummyKeyListener = new KeyAdapter() {}; private boolean isBlocking = false; private static final String CMD_BLOCKING = "lock"; private static final boolean DEBUG_POPUP_BLOCK = false; private final MouseAdapter emptyMouseListener = new MouseAdapter() {}; private final KeyAdapter emptyKeyListener = new KeyAdapter() {}; private boolean isBlocking; @Override public void installUI(JComponent c) { super.installUI(c); JLayer jlayer = (JLayer)c; if(DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().addMouseListener(dummyMouseListener); jlayer.getGlassPane().addKeyListener(dummyKeyListener); if (c instanceof JLayer) { JLayer jlayer = (JLayer) c; if (DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().addMouseListener(emptyMouseListener); jlayer.getGlassPane().addKeyListener(emptyKeyListener); } 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); } 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) { JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask(0); if(DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().removeMouseListener(dummyMouseListener); jlayer.getGlassPane().removeKeyListener(dummyKeyListener); if (c instanceof JLayer) { JLayer jlayer = (JLayer) c; jlayer.setLayerEventMask(0); if (DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().removeMouseListener(emptyMouseListener); jlayer.getGlassPane().removeKeyListener(emptyKeyListener); } } super.uninstallUI(c); } @Override protected void processComponentEvent( ComponentEvent e, JLayer<? extends JComponent> l) { System.out.println("processComponentEvent"); } @Override protected void processKeyEvent( KeyEvent e, JLayer<? extends JComponent> l) { System.out.println("processKeyEvent"); } @Override protected void processFocusEvent( FocusEvent e, JLayer<? extends JComponent> l) { System.out.println("processFocusEvent"); } @Override public void eventDispatched( AWTEvent e, JLayer<? extends JComponent> l) { if(isBlocking && e instanceof InputEvent) { ((InputEvent)e).consume(); if (isBlocking && e instanceof InputEvent) { ((InputEvent) e).consume(); } } private static final String CMD_BLOCKING = "lock"; public void setLocked(boolean flag) { boolean oldv = isBlocking; isBlocking = flag; firePropertyChange(CMD_BLOCKING,oldv,isBlocking); firePropertyChange(CMD_BLOCKING, oldv, isBlocking); } @Override public void applyPropertyChange( PropertyChangeEvent pce, JLayer<? extends JComponent> l) { String cmd = pce.getPropertyName(); if(CMD_BLOCKING.equals(cmd)) { JButton b = (JButton)l.getView(); if (CMD_BLOCKING.equals(cmd)) { JButton b = (JButton) l.getView(); b.setFocusable(!isBlocking); b.setMnemonic(isBlocking?0:b.getText().charAt(0)); b.setForeground(isBlocking?Color.RED:Color.BLACK); l.getGlassPane().setVisible((Boolean)pce.getNewValue()); b.setMnemonic(isBlocking ? 0 : b.getText().charAt(0)); b.setForeground(isBlocking ? Color.RED : Color.BLACK); l.getGlassPane().setVisible((Boolean) pce.getNewValue()); } } } }} * 解説 [#yb7749cc] 上記のサンプルでは、`LayerUI#applyPropertyChange(...)`をオーバーライドして、コンポーネントを無効にした場合の文字色、`Focus`移動の禁止、`Mnemonic`、`PopupMenu`、`ToolTip`の非表示を行なっています。 * 解説 [#explanation] - `LayerUI#applyPropertyChange(...)`をオーバーライドしてコンポーネントを無効にした場合の文字色の設定 -- `setEnabled(false)`を使用せず`JLayer`側でイベントをブロックし、`Focus`移動の禁止、`Mnemonic`、`PopupMenu`、`ToolTip`の非表示設定を実施 - `JLayer`を使用した無効時の文字色設定は[[JCheckBoxなどが無効な状態での文字色を変更>Swing/DisabledTextColor]]のように`LookAndFeel`に依存しない - `html`タグを使用したタイトル文字列もデフォルトのグレーではなく別の文字色に変換が可能 `JLayer`の場合、無効時の文字色は、[[JCheckBoxなどが無効な状態での文字色を変更>Swing/DisabledTextColor]]のように、`LookAndFeel`によっては反映されないといったことがありません。 * 参考リンク [#ba3055bc] * 参考リンク [#reference] - [[JCheckBoxなどが無効な状態での文字色を変更>Swing/DisabledTextColor]] - [[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/LayerUI.html#applyPropertyChange-java.beans.PropertyChangeEvent-javax.swing.JLayer- LayerUI#applyPropertyChange(...) (Java Platform SE 8)] - [[JButtonが無効な状態でのhtmlテキスト色を変更する>Swing/ButtonDisabledHtmlText]] * コメント [#hc112fd1] * コメント [#comment] #comment #comment