Swing/JLayerDisabledText の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/JLayerDisabledText へ行く。
- 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 --- * 概要 [#summary] `JLayer`を使用して、`JButton`などのコンポーネントを無効にしたときの文字色を変更します。 #download(https://lh5.googleusercontent.com/-_2bogxiuOec/TzilFn0ms8I/AAAAAAAABJI/oMz_T6SqCwE/s800/JLayerDisabledText.png) * サンプルコード [#sourcecode] #code(link){{ class DisableInputLayerUI extends LayerUI<JComponent> { private static final String CMD_BLOCKING = "lock"; private static final boolean DEBUG_POPUP_BLOCK = false; private final MouseAdapter dummyMouseListener = new MouseAdapter() {}; private final KeyAdapter dummyKeyListener = new KeyAdapter() {}; private final MouseAdapter emptyMouseListener = new MouseAdapter() {}; private final KeyAdapter emptyKeyListener = new KeyAdapter() {}; private boolean isBlocking; @Override public void installUI(JComponent c) { super.installUI(c); if (c instanceof JLayer) { JLayer jlayer = (JLayer) c; if (DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().addMouseListener(dummyMouseListener); jlayer.getGlassPane().addKeyListener(dummyKeyListener); 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); } } @Override public void uninstallUI(JComponent c) { if (c instanceof JLayer) { JLayer jlayer = (JLayer) c; jlayer.setLayerEventMask(0); if (DEBUG_POPUP_BLOCK) { jlayer.getGlassPane().removeMouseListener(dummyMouseListener); jlayer.getGlassPane().removeKeyListener(dummyKeyListener); 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(); } } public void setLocked(boolean flag) { boolean oldv = isBlocking; isBlocking = flag; 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(); b.setFocusable(!isBlocking); b.setMnemonic(isBlocking ? 0 : b.getText().charAt(0)); b.setForeground(isBlocking ? Color.RED : Color.BLACK); l.getGlassPane().setVisible((Boolean) pce.getNewValue()); } } } }} * 解説 [#explanation] - `LayerUI#applyPropertyChange(...)`をオーバーライドしてコンポーネントを無効にした場合の文字色の設定 -- `setEnabled(false)`を使用せず`JLayer`側でイベントをブロックし、`Focus`移動の禁止、`Mnemonic`、`PopupMenu`、`ToolTip`の非表示設定を実施 - `JLayer`を使用した無効時の文字色設定は[[JCheckBoxなどが無効な状態での文字色を変更>Swing/DisabledTextColor]]のように`LookAndFeel`に依存しない - `html`タグを使用したタイトル文字列もデフォルトのグレーではなく別の文字色に変換が可能 * 参考リンク [#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]] * コメント [#comment] #comment #comment