Вот пример, который я недавно использовал

аюсь изменить цветJToggleButton когда это было выбрано надежным, выглядеть и чувствовать себя независимым способом.

Если вы используете 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 году.

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

Ответы на вопрос(5)

Ваш ответ на вопрос