Cambiar el color de fondo de un JToggleButton seleccionado

Estoy tratando de cambiar el color de unaJToggleButton cuando se ha seleccionado de manera confiable, se ve y se siente independiente.

Si usa Metal L&F, usar UIManager es un enfoque:

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

Not: Iyy señaló que tenía un error tipográfico en el nombre de la propiedad anterior, pero lo dejaré arriba para las personas que lleguen aquí, pero se supone que el nombre real de la propiedad es:

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

Sin embargo, esto no funciona en mi aspecto actual (actualmente Windows XP). Después de un análisis más detallado, parece que el aspecto del sistema en Windows (aún XP) no utiliza ninguno de losColor-basadoUIManager propiedades paraToggleButton en absoluto, o al menos no los suministra por sí mismo (hay un ejemplo rápido en línea para busque todas las claves de propiedad deUIManager, que en el ejemplo está convenientemente limitado explícitamente aColor propiedades).

He intentado configurar el color de fondo:

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

No solo no cambia el estado seleccionado, sino que ni siquiera afecta el estado no seleccionado.

He intentado cambiar el color de fondo solo después de recibir la acción:

@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 de eso funciona. Lo único que he encontrado que funciona requiere que dibuje el botón yo mismo en el estado seleccionado (lo que lleva a un ejemplo de trabajo, aunque no sea estándar):

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

Eso está ligeramente modificado de un comentario en esteJava informe de error. Curiosamente (¿divertido?), En las reclamaciones que se han solucionado en 1998.

¿Alguien sabe de una mejor manera independiente de L&F para establecer el color de fondo de un JToggleButton seleccionado?

Respuestas a la pregunta(5)

Su respuesta a la pregunta