Alterar a cor de fundo de um JToggleButton selecionado

Estou tentando mudar a cor de umJToggleButton quando ele tiver sido selecionado de uma maneira confiável e com aparência independent

Se usar o Metal L&F, o UIManager é uma abordagem:

UIManager.put("ToggleButton.selected", Color.RED);

Not: Iyy apontou que eu cometi um erro de digitação no nome da propriedade acima, mas deixarei isso para as pessoas que estão chegando aqui, mas o nome da propriedade real deve ser:

UIManager.put("ToggleButton.select", Color.RED);

No entanto, isso não funciona na minha aparência atual (atualmente Windows XP). Após algumas análises, parece que a aparência do sistema no Windows (ainda no XP) não usa nenhum dosColor-SediadaUIManager propriedades paraToggleButton, ou pelo menos não os fornece (há um rápido exemplo on-line para encontre todas as chaves de propriedade doUIManager, que no exemplo é convenientemente limitado explicitamente aColor propriedades).

Tentei definir a cor de fundo:

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);

Ele não altera apenas o estado selecionado, mas isso nem afeta o estado não selecionad

Tentei alterar a cor do plano de fundo somente após receber a ação:

@Override
public void actionPerformed(ActionEvent e)
{
    JToggleButton button = (JToggleButton)e.getSource();
    if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY)
    {
        button.setBackground(Color.RED);
    }
}

Nada disso funciona. A única coisa que eu encontrei para trabalhar exige que eu mesmo puxe o botão no estado selecionado (o que leva a um exemplo de trabalho, embora com aparência não padrão):

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);
        }
    }
}

Isso é ligeiramente modificado a partir de um comentário nesteJava bug report. Curiosamente (divertidamente?), As reivindicações foram corrigidas em 1998.

lguém conhece uma maneira melhor e independente de L&F de definir a cor de fundo de um JToggleButton selecionad

questionAnswers(5)

yourAnswerToTheQuestion