更改所选JToggleButton的背景颜色

| 我试图以可靠,独立的外观选择independent0ѭ的颜色。 如果使用Metal L&F,则使用UIManager是一种方法:
UIManager.put(\"ToggleButton.selected\", Color.RED);
注意:Iyy指出我在上面的属性名称中有一个错字,但是我会留给上面的人输入,但实际的属性名称应该是:
UIManager.put(\"ToggleButton.select\", Color.RED);
但是,这在我当前的外观(当前为Windows XP)中不起作用。经过进一步分析,看来Windows(仍然是XP)中的系统外观完全没有为ѭ5使用任何基于ѭ3的
UIManager
属性,或者至少它本身不提供这些属性(有一个简单的例子可以从
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的背景颜色?     
已邀请:
您可能会看到
setIcon()
是否足以满足您的目的,但是您也可以在
ButtonUI
委托中覆盖
paint()
。 附录:@kleopatra的评论很受好评:更改UI委托并非易事。 @mKorbel的最新示例说明了该方法的难度和多功能性。它的基本优势是外观独立。 这里提到一些不太雄心勃勃的方法。     
\“ ToggleButton.selected \”是错误的,它需要\“ ToggleButton.select \”。 并且应该更新组件。
UIManager.put(\"ToggleButton.select\", Color.WHITE);
SwingUtilities.updateComponentTreeUI(togglebuttonname);
    
JToggleButton btn = new JToggleButton(...);
btn.setUI(new MetalToggleButtonUI() {
    @Override
    protected Color getSelectColor() {
        return Color.RED;
    }
});
    
您可以简单地在每次重绘之前强制使用背景颜色-为此,您必须更改paintComponent,检查按钮是否已切换,根据切换状态设置背景,最后,让超类执行实际的绘制工作:
public class ColoredToggleButton extends JToggleButton
{
    @Override
    public void paintComponent(Graphics g)
    {
        Color bg;
        if (isSelected()){
            bg = Color.GREEN;
        } else {
            bg = Color.RED;
        }
        setBackground(bg);
        super.paintComponent(g);
    }
}
    
当使用“ Windows外观”时;在Netbeans中,您只需要做两件事。 前往属性 取消选择\'contentAreaFilled \' 选择“不透明” 您可以在属性中或通过硬编码设置背景色 换一种方式
    jToggleButton.setContentAreaFilled(false);
    jToggleButton.setOpaque(true);
    jToggleButton.setBackground(Color.red); //Your color here
就这样。:-)     
如果您宁愿在UI中使用动作侦听器而不是覆盖方法,则只需将UI更改为没有任何“ 18”属性的UI。 这是我最近使用的一个例子
private class FavouriteToggle extends JToggleButton {
    public FavouriteToggle() {
        setUI(new BasicToggleButtonUI()); //Removes selectColor

        ////Your Custom L&F Settings////
        setBackground(new Color(255, 252, 92));
        setForeground(Color.GRAY);
        setText(\"Favourite\");
        setBorder(null);
        setFocusPainted(false);

        ////Add your own select color by setting background////
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(((JToggleButton) e.getSource()).isSelected()) {
                    setForeground(Color.BLACK);
                    setBackground(new Color(255, 251, 0));
                } else {
                    setBackground(new Color(255, 252, 92));
                    setForeground(Color.GRAY);
                }
            }
        });
    }
}
    

要回复问题请先登录注册