Я пытаюсь изменить цвет JToggleButton
, когда он был выбран надежным, независимым и надежным способом.
Если вы используете Metal L & F, то использование UIManager является подходом:
UIManager.put("ToggleButton.selected", Color.RED);
Примечание : Iyy указал, что у меня была опечатка в названии свойства выше, но я оставлю это выше для людей, которые попадают сюда, но реальное имя свойства должноbe:
UIManager.put("ToggleButton.select", Color.RED);
Однако, это не работает в моем текущем стиле (в настоящее время Windows XP).После некоторого дальнейшего анализа выясняется, что внешний вид системы в Windows (все еще XP) вообще не использует никаких UIManager
-основных *1013* свойств для 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?