当前位置: 首页 > 面试题库 >

更改所选JToggleButton的背景颜色

呼延靖
2023-03-14
问题内容

我正在尝试以JToggleButton可靠,外观独立的方式更改a的颜色。

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

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

注意 :Iyy指出我在上面的属性名称中有一个错字,但是我会留给上面的人输入,但实际的属性名称应该是:

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

但是,这在我当前的外观(当前为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);

它不仅不会更改选定状态,而且甚至不会影响未选定状态。

我仅在收到操作后才尝试更改背景颜色:

@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()足以满足您的目的,但是您也可以paint()ButtonUI委托中进行覆盖。

附录:@克列奥帕特拉的评论是精心考虑:改变UI委托是
平凡的。@mKorbel的最新示例显示了该方法的难度和多功能性。它的基本优势是外观独立。

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



 类似资料:
  • 我有一个将初始背景颜色设置为红色的按钮。我有一个在红色和深红色之间翻转的动作程序。基本上,如果选择按钮,它是红色的。没有选中,是暗红色。 代码运行,但是每当选择切换按钮时,它都是白色的。所以我在深红色和白色之间切换。 我所做的:我做了很多代码实验,但毫无进展。我做了很多网络搜索,但找不出一个有效的例子。 我正在使用Java11。我需要在代码中更改什么才能获得我想要的行为?

  • 我有一个选择框,当选择框被单击并显示所有选项时,我正在尝试更改选项的背景颜色。

  • 我有一个清单,我在回收商的视图中展示了这一点 一些项目有蓝色背景和其他项目有灰色背景 我想编辑所选项目背景(所选项目表示已单击的项目) 这是我的适配器类

  • 问题内容: 有什么方法可以更改RibbonApplicationMenuEntryPrimary(Flamingo)的背景颜色吗? 我看了看它的javadoc,但找不到方法。 问题答案: 1)请注意,我已检查API;从开始,有很多导入和扩展,它们来自许多不同的方法(这里是我尝试覆盖MetalButtonUI的尝试)。 2)也许更改内置颜色主题会很容易,但是我不建议这样做。 3)我不是Flaming

  • 我有一个带有半径和笔划的CardView,但当我以编程方式更改CardView背景时,半径和笔划将丢失,我希望新颜色保留在笔划内。 这是我的cardview xml 这里是我换颜色的地方:

  • 我正在使用RangeSeekBar为3种情况设置一些值(即绿色=OK,琥珀色=警告,红色=撤离)...我正在使用xml绘图来设置背景 我知道我可以通过编程更改渐变,但如何缩小起始颜色并增加结束颜色?有人能解决这个问题吗? 谢谢