我有一个Swing JButton,我也在为我的项目使用以下代码:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
现在,当尝试使用btnNewButton.setBackground(Color.RED);
更改一个按钮的背景时,它不会变为红色,只有边框变为红色。
如何在将UIManager.getSystemLookAndFeelClassName()
用于剩余的组件/项目的同时将此背景变为红色?
答案 0 :(得分:5)
看看bug 4880747 : XP L&F: REGRESSION: setBackground on JButton sets border color in Windows XP。评估部分说明:
更改按钮的外观总是会导致冲突 目前的L& F实施。 Swing的Windows L& F试图成为 尽可能接近原生显示。在XP上,我们使用内置的 按钮的位图资源。这些都不能着色 就像在原生API中一样。
您应该在按钮上调用setContentAreaFilled(false)以避免 让L& F涂上它的装饰品。这有副作用 按钮的opaque属性设置为false,因此您需要关注 通过调用setOpaque(true)来调用。
这不是错误,将会关闭。
如前所述,setContentAreaFilled(false)
和setOpaque(true)
可以解决问题,但按钮看起来会有所不同。
如果值得给您带来麻烦,您可以创建自己的ButtonUI
。这是@mKorbel的一个很棒的example你可能会觉得很有用。
答案 1 :(得分:1)
这取决于你想要达到的目标。
您可以使用JButton#setContentAreaFilled
将其传递为false,但是您可能还需要调用JButton#setBorderPainted
传递它
您还可以更改按钮背景的UIManager
默认值
答案 2 :(得分:0)
你应该使JButton
不透明:
btnNewButton.setOpaque(true);
正如oracle文档中JComponent#setBackground
方法所指定的那样:
设置此组件的背景颜色。背景颜色是 仅在组件不透明且仅由子类的子类时使用 JComponent或ComponentUI实现。直接子类 JComponent必须覆盖paintComponent才能使用此属性。
尊重这个属性取决于外观和感觉,有些人可能会选择 忽略它。
我认为当前的外观并不支持这种属性。这就是为什么在这种情况下会忽略背景颜色。