改变JButton的背景

我有一个Swing JButton,我也在为我的项目使用以下代码:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

现在尝试使用btnNewButton.setBackground(Color.RED);更改一个按钮的背景时btnNewButton.setBackground(Color.RED); 它不会变红,只有边框变红。

如何在仍为其余组件/项目使用UIManager.getSystemLookAndFeelClassName()同时将此背景变为红色?

看看bug 4880747:XP L&F:REGRESSION:JButton上的setBackground在Windows XP中设置边框颜色 。 评估部分说明:

更改按钮的外观总是会导致与当前L&F实现发生冲突。 Windows L&F for Swing尝试尽可能接近原生显示。 在XP上,我们使用按钮的内置位图资源。 这些不能着色,就像在本机API中一样。

您应该在按钮上调用setContentAreaFilled(false)以避免L&F绘制其装饰。 这具有按钮的opaque属性设置为false的副作用,因此您需要通过调用setOpaque(true)来跟随该调用。

这不是错误,将被关闭。

如上所述, setContentAreaFilled(false)setOpaque(true)将完成这一操作,但按钮看起来会有所不同。

如果值得一试,你可以创建自己的ButtonUI 。 这是@mKorbel的一个很好的例子 ,你可能会发现它很有用。

这取决于您想要实现的目标。

你可以使用JButton#setContentAreaFilled传递它为false,但你可能还需要调用JButton#setBorderPainted传递它掉落

您还可以更改按钮背景的UIManager的默认值

你应该使JButton不透明:

 btnNewButton.setOpaque(true); 

正如oracle文档中为JComponent#setBackground方法指定的那样:

设置此组件的背景颜色。 仅当组件不透明时才使用背景颜色,并且仅使用JComponent或ComponentUI实现的子类。 JComponent的直接子类必须覆盖paintComponent才能使用此属性。

尊重这个属性取决于外观和感觉,有些人可能会选择忽略它。

我认为当前的外观并不支持这种属性。这就是为什么在这种情况下忽略背景颜色的原因。