• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JLayerを使用して無効時のコンポーネントの文字色を変更する
#navi(../)
RIGHT:Posted by &author(aterai); at 2012-02-13
*JLayerを使用して無効時のコンポーネントの文字色を変更する [#la63e3a8]
JLayerを使用して、JButtonなどのコンポーネントを無効にしたときの文字色を変更します。
---
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`などのコンポーネントを無効にしたときの文字色を変更します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh5.googleusercontent.com/-_2bogxiuOec/TzilFn0ms8I/AAAAAAAABJI/oMz_T6SqCwE/s800/JLayerDisabledText.png)

//#screenshot
#ref(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]] のように、Look&Feel によっては反映されないといったことがありません。
* 参考リンク [#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]]

**参考リンク [#ba3055bc]
-[[JCheckBoxなどが無効な状態での文字色を変更>Swing/DisabledTextColor]]
-[[JLayerで指定したコンポーネントへの入力を禁止>Swing/DisableInputLayer]]

**コメント [#hc112fd1]
* コメント [#comment]
#comment
#comment