JButtonが無効な状態でのhtmlテキスト色を変更する
Total: 782
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JButton
が無効な状態でのhtml
テキスト色をデフォルトのグレーではなく半透明にした元のhtml
テキスト色で上書きします。
Screenshot
Advertisement
サンプルコード
class DisabledHtmlTextLayerUI<V extends AbstractButton> extends LayerUI<V> {
private final JLabel label = new JLabel();
private final JPanel canvas = new JPanel();
@Override public void updateUI(JLayer<? extends V> l) {
super.updateUI(l);
SwingUtilities.updateComponentTreeUI(label);
}
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
if (c instanceof JLayer) {
Component view = ((JLayer<?>) c).getView();
if (!view.isEnabled()) {
paintDisabledText(g, view);
}
}
}
private void paintDisabledText(Graphics g, Component c) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton) c;
label.setFont(b.getFont());
label.setText(b.getText());
label.setIcon(b.getIcon());
label.setVerticalAlignment(b.getVerticalAlignment());
label.setHorizontalAlignment(b.getHorizontalAlignment());
label.setVerticalTextPosition(b.getVerticalTextPosition());
label.setHorizontalTextPosition(b.getHorizontalTextPosition());
label.setForeground(UIManager.getColor("Button.disabledText"));
label.setOpaque(false);
Graphics2D g2 = (Graphics2D) g.create();
g2.setComposite(
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .25f));
Rectangle r = b.getBounds();
SwingUtilities.paintComponent(
g2, label, canvas, r.x, r.y, r.width, r.height);
g2.dispose();
}
}
}
View in GitHub: Java, Kotlin解説
Default
html
タグで文字色を変更している場合でもJButton#setEnabled(false)
で文字列すべてがグレーアウトになるUIManager.put("Button.disabledText", Color.RED)
などの設定も無効になる- JCheckBoxなどが無効な状態での文字色を変更
JLayer1
JButton#setEnabled(false)
は使用せず、JLayer
でマウスクリックやキー入力をブロックし、入力ブロック中はLayerUI#paint(...)
内でJButton
を半透明で描画- JLayerを使用して無効時のコンポーネントの文字色を変更する
- JLayerで指定したコンポーネントへの入力を禁止
JLayer2
JLayer
を追加しJButton#setEnabled(false)
の場合はJButton
のプロパティをコピーした背景は透明、テキストは半透明のJLabel
を重ねて描画- JProgressBarの文字列をJLayerを使って表示する
参考リンク
- JCheckBoxなどが無効な状態での文字色を変更
- JLayerを使用して無効時のコンポーネントの文字色を変更する
- JLayerで指定したコンポーネントへの入力を禁止
- JProgressBarの文字列をJLayerを使って表示する