更改所选JToggleButton的背景颜色

pic*_*ypg 8 java swing uimanager custom-component jtogglebutton

我试图以JToggleButton可靠,外观和感觉独立的方式改变它的颜色.

如果使用Metal L&F,那么使用UIManager是一种方法:

UIManager.put("ToggleButton.selected", Color.RED);
Run Code Online (Sandbox Code Playgroud)

注意:Iyy指出我上面的属性名称中有一个拼写错误,但我会将其留在上面,以便人们到达这里,但实际的属性名称应该是:

UIManager.put("ToggleButton.select", Color.RED);
Run Code Online (Sandbox Code Playgroud)

但是,这在我目前的外观(目前是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);
Run Code Online (Sandbox Code Playgroud)

它不仅不会改变选定的状态,而且甚至不会影响未选择的状态.

我在尝试接收动作后尝试更改背景颜色:

@Override
public void actionPerformed(ActionEvent e)
{
    JToggleButton button = (JToggleButton)e.getSource();
    if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY)
    {
        button.setBackground(Color.RED);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.我发现工作的唯一要求是我自己在选定状态下绘制按钮(这导致一个工作示例,虽然看起来非标准):

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从这个Java错误报告中的注释稍微修改了一下.有趣的是(有趣的?),在声称已于1998年修复.

有没有人知道更好的L&F独立方式来设置所选JToggleButton的背景颜色?

小智 5

"ToggleButton.selected"错误,需要"ToggleButton.select".并且应该更新到组件.

UIManager.put("ToggleButton.select", Color.WHITE);
SwingUtilities.updateComponentTreeUI(togglebuttonname);
Run Code Online (Sandbox Code Playgroud)


rsu*_*min 5

JToggleButton btn = new JToggleButton(...);
btn.setUI(new MetalToggleButtonUI() {
    @Override
    protected Color getSelectColor() {
        return Color.RED;
    }
});
Run Code Online (Sandbox Code Playgroud)


tra*_*god 3

您可能会看到是否setIcon()足以满足您的目的,但您也可以paint()ButtonUI委托中覆盖。

附录:@kleopatra 的评论很受欢迎:更改 UI 委托并非易事。@mKorbel 最近的例子显示了该方法的难度和多功能性。它的本质优势是外观和感觉独立。

这里提到了一些不太雄心勃勃的方法。