JToggleButton
信頼性の高い、ルック アンド フィールに依存しない方法で選択されたときに、a の色を変更しようとしています。
Metal L&F を使用している場合は、UIManager を使用する方法があります。
UIManager.put("ToggleButton.selected", Color.RED);
注: Iyy は、上記のプロパティ名にタイプミスがあることを指摘しましたが、ここに来る人々のために上に残しておきますが、実際のプロパティ名は次のようになるはずです:
UIManager.put("ToggleButton.select", Color.RED);
ただし、これは現在のルック アンド フィール (現在の Windows XP) では機能しません。さらに分析した結果、Windows (まだ XP) のシステムのルック アンド フィールは、Color
ベースのUIManager
プロパティをまったく使用していないToggleButton
か、少なくともそれ自体を提供していないようです (オンラインで見つけるための簡単な例があります)。のすべてのプロパティ キーUIManager
。この例では、プロパティに明示的に制限されているため便利Color
です)。
背景色を設定してみました:
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) { /* stuff */ }
};
JToggleButton button = new JToggleButton(action);
// tried with and without opaque true
button.setOpaque(true);
button.setBackground(Color.RED);
選択された状態を変更しないだけでなく、選択されていない状態にも影響しません。
アクションを受け取った後にのみ背景色を変更しようとしました:
@Override
public void actionPerformed(ActionEvent e)
{
JToggleButton button = (JToggleButton)e.getSource();
if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY)
{
button.setBackground(Color.RED);
}
}
どれもうまくいきません。動作することがわかった唯一のことは、選択した状態でボタンを自分で描画する必要があることです (非標準の外観ではありますが、実際の例につながります)。
private class ColoredToggleButton extends JToggleButton
{
ColoredToggleButton(Action action, Color color)
{
super(action);
setBackground(color);
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (this.isSelected())
{
int w = getWidth();
int h = getHeight();
String s = getText();
// selected color
g.setColor(getBackground());
g.fillRect(0, 0, w, h);
// selected foreground color
g.setColor(SystemColor.controlText);
g.drawString(s,
(w - g.getFontMetrics().stringWidth(s)) / 2 + 1,
(h + g.getFontMetrics().getAscent()) / 2 - 1);
}
}
}
これは、このJava バグ レポートのコメントを少し変更したものです。興味深いことに (面白いことに?)、1998 年に修正されたという主張があります。
選択した JToggleButton の背景色を設定する、L&F に依存しないより良い方法を知っている人はいますか?