更改JButton的背景

3

我有一个Swing JButton,同时在我的项目中也使用了以下代码:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

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

如何在仍然使用UIManager.getSystemLookAndFeelClassName()的情况下将此背景变为红色以适用于其他组件/项目?


你的按钮有图标(图片)吗?如果是这样,背景确实会变红,但被按钮图标隐藏,给人的印象只有“边框”发生了改变。 - Jonathan Drapeau
1
嗯,即使没有图标,它仍然发生,所以不是那个问题。只要我有UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 只有边框会改变颜色... - Omid
3个回答

5
请查阅错误编号为 4880747 的 bug。评估部分说明:
更改按钮的外观可能会与当前 L&F 实现发生冲突。Swing 的 Windows L&F 尽可能接近本地显示。在 XP 上,我们使用内置的位图资源来处理按钮。这些资源无法着色,就像本机 API 一样。
您应该在按钮上调用 setContentAreaFilled(false) 以避免 L&F 绘制其装饰效果。这会导致按钮的 opaque 属性设置为 false,因此您需要紧跟其后调用 setOpaque(true)。
这不是一个错误,将被关闭。
如上所述,setContentAreaFilled(false)和setOpaque(true) 将解决问题,但是按钮的外观会有所不同。
如果值得这么做,您可以创建自己的 ButtonUI。@mKorbel提供了一个很好的示例,您可能会发现它有用。

1
虽然有些晚了,但我仍然觉得有必要留个感谢的话。这很有帮助。 :) - Soham Chowdhury

1
这取决于您想要实现什么。
您可以使用JButton#setContentAreaFilled并将其设置为false,但您可能还需要调用JButton#setBorderPainted并将其设置为false。
您还可以更改UIManager的默认按钮背景值。

如果我们设置 UIManager 的默认值,那么所有的 JButton 都会反映这个更改。难道没有一种只更改一个 JButton 背景的方法吗? - Vishal K
并不是真的,只是保持按钮的外观。 - MadProgrammer
+1 对于 setContentAreaFilled。虽然在 WindowsLookAndFeel 下看起来有点奇怪 :) - tenorsax
@VishalK 我确实认为你可以提供自己的UI委托,但这意味着你需要为每个可能使用的外观提供一个UI委托,那是很多工作。 - MadProgrammer

0

你应该使 JButton 不透明:

btnNewButton.setOpaque(true);

根据oracle文档中JComponent#setBackground方法的规定:

设置此组件的背景颜色。如果组件是不透明的,则仅使用背景颜色,并由JComponent的直接子类或者ComponentUI实现的子类使用。JComponent的直接子类必须重写paintComponent以遵守此属性。

这取决于外观的支持,有些可能会选择忽略它。

我认为当前的外观不支持这个属性...所以在这种情况下会忽略背景颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接