3

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

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

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

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

4

3 回答 3

5

查看错误4880747:XP L&F: REGRESSION: setBackground on JButton 在 Windows XP 中设置边框颜色。评估部分指出:

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

您应该在按钮上调用 setContentAreaFilled(false) 以避免 L&F 绘制其装饰。这样做的副作用是按钮的 opaque 属性设置为 false,因此您需要在该调用之后调用 setOpaque(true)。

这不是错误,将被关闭。

如前所述,setContentAreaFilled(false)并且setOpaque(true)可以解决问题,但是按钮看起来会有所不同。

如果它值得你创建你自己的麻烦ButtonUI。这是@mKorbel 提供的一个很好的示例,您可能会发现它很有用。

于 2013-04-10T20:50:33.260 回答
1

这取决于您想要达到的目标。

您可以使用JButton#setContentAreaFilled将其传递为假,但您可能还需要调用JButton#setBorderPainted传递它跌倒

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

于 2013-04-10T20:52:25.980 回答
0

你应该使JButton不透明:

btnNewButton.setOpaque(true);

JComponent#setBackground如oracle 文档中指定的方法:

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

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

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

于 2013-04-10T20:39:11.657 回答