改变JButton的背景

时间:2013-04-10 20:26:41

标签: java swing jbutton

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

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

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

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

3 个答案:

答案 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才能使用此属性。

     

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

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