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 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.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);
}
}
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