更改所选JToggleButton的背景颜色

我正在尝试以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的最新示例显示了该方法的难度和多功能性。它的基本优势是外观独立。

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

以上是 更改所选JToggleButton的背景颜色 的全部内容, 来源链接: utcz.com/qa/400930.html

回到顶部