概要
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テキスト色を変更する