Swing/JLayerDisabledText のバックアップの現在との差分(No.1)
TITLE:JLayerを使用して無効時のコンポーネントの文字色を変更する
Posted by aterai at 2012-02-13
JLayerを使用して無効時のコンポーネントの文字色を変更する
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:
概要
JLayer
を使用して、JButton
などのコンポーネントを無効にしたときの文字色を変更します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
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;
#spanadd
#spanend
@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);
}
#spanadd
#spanend
@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);
}
#spanadd
#spanend
@Override protected void processComponentEvent(
ComponentEvent e, JLayer<? extends JComponent> l) {
System.out.println("processComponentEvent");
}
#spanadd
#spanend
@Override protected void processKeyEvent(
KeyEvent e, JLayer<? extends JComponent> l) {
System.out.println("processKeyEvent");
}
#spanadd
#spanend
@Override protected void processFocusEvent(
FocusEvent e, JLayer<? extends JComponent> l) {
System.out.println("processFocusEvent");
}
#spanadd
#spanend
@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";
#spanadd
#spanend
public void setLocked(boolean flag) {
boolean oldv = isBlocking;
isBlocking = flag;
firePropertyChange(CMD_BLOCKING,oldv,isBlocking);
firePropertyChange(CMD_BLOCKING, oldv, isBlocking);
}
#spanadd
#spanend
@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());
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、LayerUI#applyPropertyChange(...) をオーバーライドして、コンポーネントを無効にした場合の文字色、Focus移動の禁止、Mnemonic、PopupMenu、ToolTip の非表示を行なっています。解説
-
LayerUI#applyPropertyChange(...)
をオーバーライドしてコンポーネントを無効にした場合の文字色の設定-
setEnabled(false)
を使用せずJLayer
側でイベントをブロックし、Focus
移動の禁止、Mnemonic
、PopupMenu
、ToolTip
の非表示設定を実施
-
-
JLayer
を使用した無効時の文字色設定はJCheckBoxなどが無効な状態での文字色を変更のようにLookAndFeel
に依存しない -
html
タグを使用したタイトル文字列もデフォルトのグレーではなく別の文字色に変換が可能
参考リンク
- JCheckBoxなどが無効な状態での文字色を変更
- JLayerで指定したコンポーネントへの入力を禁止
- LayerUI#applyPropertyChange(...) (Java Platform SE 8)
- JButtonが無効な状態でのhtmlテキスト色を変更する