Swing/JLayerDisabledText のバックアップ(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/JLayerDisabledText へ行く。
- 1 (2012-12-13 (木) 15:37:19)
- 2 (2013-08-17 (土) 15:39:14)
- 3 (2015-02-03 (火) 16:20:41)
- 4 (2016-09-08 (木) 20:30:13)
- 5 (2017-10-15 (日) 20:11:26)
- 6 (2019-04-19 (金) 14:05:59)
- 7 (2021-01-31 (日) 08:43:35)
- 8 (2023-02-01 (水) 11:37:04)
- 9 (2023-02-06 (月) 00:00:47)
- 10 (2024-02-09 (金) 15:08:41)
- 11 (2025-01-03 (金) 08:57:02)
- 12 (2025-01-03 (金) 09:01:23)
- 13 (2025-01-03 (金) 09:02:38)
- 14 (2025-01-03 (金) 09:03:21)
- 15 (2025-01-03 (金) 09:04:02)
- 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:
Summary
JLayer
を使用して、JButton
などのコンポーネントを無効にしたときの文字色を変更します。
Screenshot

Advertisement
サンプルコード
class DisableInputLayerUI extends LayerUI<JComponent> {
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);
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);
}
}
@Override public void uninstallUI(JComponent c) {
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();
}
}
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());
}
}
}
View in GitHub: Java, Kotlin解説
LayerUI#applyPropertyChange(...)
をオーバーライドしてコンポーネントを無効にした場合の文字色の設定setEnabled(false)
を使用せずJLayer
側でイベントをブロックし、Focus
移動の禁止、Mnemonic
、PopupMenu
、ToolTip
の非表示設定を実施
JLayer
を使用した無効時の文字色設定はJCheckBoxなどが無効な状態での文字色を変更のようにLookAndFeel
に依存しないhtml
タグを使用したタイトル文字列もデフォルトのグレーではなく別の文字色に変換が可能
参考リンク
- JCheckBoxなどが無効な状態での文字色を変更
- JLayerで指定したコンポーネントへの入力を禁止
- LayerUI#applyPropertyChange(...) (Java Platform SE 8)
- JButtonが無効な状態でのhtmlテキスト色を変更する