Вот пример, который я недавно использовал
аюсь изменить цвет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?