【发布时间】:2011-08-14 01:28:40
【问题描述】:
当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,或者至少它自己不提供它们(find all property keys from the 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 bug report 中的评论稍作修改。有趣的是(有趣的是?),声称已在 1998 年修复。
有谁知道设置选定 JToggleButton 的背景颜色的更好的、独立于 L&F 的方法?
【问题讨论】:
-
你可以覆盖 BasicbuttonUI 或只是 MetalButtonUI(然后只用于 Metal L&F)一些提示stackoverflow.com/questions/5751311/…
-
为什么? LAF 应该控制外观,最好让它发挥作用 - 如果成功干扰,您的自定义油漆/颜色将像拇指一样突出
-
@kleopatra 我通常同意离开 L&F 是一种很好的做法,但简单地说,这是一个理想的功能。特别是,它实际上是为了突出。
标签: java swing custom-component uimanager jtogglebutton