我正在尝试以一种可靠、与外观无关的方式更改选中的
如果使用Metal L&F,则可以使用UIManager来实现:
注意:Iyy指出我在上面的属性名称中有一个拼写错误,但我会保留它供到达此处的人参考,但实际的属性名称应该是:
然而,在我的当前外观(目前是Windows XP)中,这并不起作用。经过进一步分析,似乎Windows中的系统外观(仍然是XP)根本不使用任何基于颜色的UIManager属性来设置ToggleButton,或者至少它自己没有提供它们(有一个快速的在线示例可以找到UIManager的所有属性键,该示例方便地明确限制为颜色属性)。
我尝试过设置背景颜色:
不仅它不改变所选状态,而且它甚至不影响未选状态。
我尝试在接收到动作后仅更改背景颜色。
没有一个方法有效。我唯一发现有效的方法是需要我自己在选中状态下绘制按钮(这会导致一个有效的示例,尽管外观不符合标准):
这是从这个Java bug report中稍作修改的评论。有趣的是(令人发笑的是?),它声称在1998年已经修复。
有人知道有没有更好的、与L&F无关的方法来设置选中的JToggleButton的背景颜色吗?
JToggleButton
的颜色。如果使用Metal L&F,则可以使用UIManager来实现:
UIManager.put("ToggleButton.selected", Color.RED);
注意:Iyy指出我在上面的属性名称中有一个拼写错误,但我会保留它供到达此处的人参考,但实际的属性名称应该是:
UIManager.put("ToggleButton.select", Color.RED);
然而,在我的当前外观(目前是Windows XP)中,这并不起作用。经过进一步分析,似乎Windows中的系统外观(仍然是XP)根本不使用任何基于颜色的UIManager属性来设置ToggleButton,或者至少它自己没有提供它们(有一个快速的在线示例可以找到UIManager的所有属性键,该示例方便地明确限制为颜色属性)。
我尝试过设置背景颜色:
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 bug report中稍作修改的评论。有趣的是(令人发笑的是?),它声称在1998年已经修复。
有人知道有没有更好的、与L&F无关的方法来设置选中的JToggleButton的背景颜色吗?