Изменение цвета фона выбранного JToggleButton

Я пытаюсь изменить цвет JToggleButton , когда он выбран надежным, независимым от внешнего вида способом .

Если вы используете Metal L&F, то подходом является использование UIManager:

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

Примечание : Iyy указал, что у меня есть опечатка в названии свойства выше, но я оставлю это выше для людей, попадающих сюда, но фактическое имя свойства должно быть:

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

Однако это не работает в моем текущем Look and Feel (в настоящее время Windows XP). После некоторого дальнейшего анализа выяснилось, что внешний вид системы в Windows (все еще XP) не использует никаких свойств UIManager на основе Color для 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 году.

Кто-нибудь знает лучший, независимый от L&F способ установки цвета фона для выбранного JToggleButton?

8
задан mKorbel 5 March 2013 в 20:34
поделиться