更改所选JToggleButton的背景颜色

时间:2011-04-27 17:21:26

标签: java swing custom-component uimanager jtogglebutton

我试图以可靠,独立于外观的方式更改JToggleButton的颜色。

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

UIManager.put("ToggleButton.selected", Color.RED);

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

UIManager.put("ToggleButton.select", Color.RED);

但是,这在我目前的外观(目前是Windows XP)中不起作用。经过一些进一步的分析,看起来Windows(仍然是XP)中的系统外观根本不使用Color的任何基于UIManager的{​​{1}}属性,或者它至少不提供它们本身(在线find all property keys from the UIManager有一个快速示例,在示例中明确地明确限制为ToggleButton属性。)

我尝试过设置背景颜色:

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);
    }
}

稍微修改了此Java bug report中的评论。有趣的是(有趣的?),声称已于1998年修复。

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

6 个答案:

答案 0 :(得分:5)

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

UIManager.put("ToggleButton.select", Color.WHITE);
SwingUtilities.updateComponentTreeUI(togglebuttonname);

答案 1 :(得分:5)

JToggleButton btn = new JToggleButton(...);
btn.setUI(new MetalToggleButtonUI() {
    @Override
    protected Color getSelectColor() {
        return Color.RED;
    }
});

答案 2 :(得分:3)

您可能会看到setIcon()是否足以达到您的目的,但您也可以覆盖ButtonUI代表中的paint()

附录:@ kleopatra的评论很好:改变UI代表是微不足道的。 @ mKorbel最近的example显示了该方法的难度和多功能性。它的主要优点是外观和感到独立。

提到了一些不那么雄心勃勃的方法here

答案 3 :(得分:1)

你可以简单地在每次重绘之前强制背景颜色 - 因为你必须改变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);
    }
}

答案 4 :(得分:1)

使用“ Windows外观”时;在Netbeans中,您只需要做两件事。

  1. 转到属性
  2. 取消选择“ contentAreaFilled”
  3. 选择“不透明”
  4. 您可以在属性中或通过硬编码设置背景颜色

以其他方式,

    jToggleButton.setContentAreaFilled(false);
    jToggleButton.setOpaque(true);
    jToggleButton.setBackground(Color.red); //Your color here

仅此而已::-)

答案 5 :(得分:0)

如果您更愿意使用动作侦听器而不是覆盖UI中的方法,则可以将UI更改为不带任何selectColor属性的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);
                }
            }
        });
    }
}