2013-04-10 109 views
3

的背景我有一个Swing的JButton,我也用我的项目下面的代码:更改的JButton

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

现在试图改变背景使用btnNewButton.setBackground(Color.RED);一个按钮,它不转时红色,只有边界变红。

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

+0

请问您的按钮有图标(图像)?如果是这样,背景会变成红色,但被按钮的图标隐藏,给人的印象是只有“边框”被改变。 – 2013-04-10 20:29:52

+1

嗯,即使没有图标,它仍然发生,所以不是这样。只要我有UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());只有边框改变颜色... – Omid 2013-04-10 20:32:01

回答

5

看看bug 4880747 : XP L&F: REGRESSION: setBackground on JButton sets border color in Windows XP。评价节规定:

更改按钮的外观总能引起冲突与 的电流I & F实现。用于Swing的Windows L &尝试将 尽可能靠近本地显示。在XP上,我们使用按钮的内置 位图资源。这些不能被彩色化,就像在本机API中一样 。

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

这不是一个错误,将被关闭。

如前所述,setContentAreaFilled(false)setOpaque(true)将做的伎俩,但按钮看起来不同。

如果值得麻烦您可以创建自己的ButtonUI。这是@ mKorbel很棒的example,你可能会觉得有用。

+1

这已经很晚了,但我仍然觉得需要留下感谢信息。这帮助了我。 :) – 2015-12-22 09:58:01

0

应进行JButton不透明:

btnNewButton.setOpaque(true); 

至于JComponent#setBackground方法Oracle文档中规定:

设置组件的背景色。背景颜色为 仅在组件不透明时才使用,并且只能由JComponent或ComponentUI实现的子类 使用。直接子类 JComponent必须重写paintComponent才能遵守此属性。

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

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

+0

同样的事情,不起作用。 – Omid 2013-04-10 20:40:32

+0

你正在使用哪个操作系统? – 2013-04-10 20:40:53

+0

Windows 8.只想更改窗口的背景.. – Omid 2013-04-10 20:41:32

1

这取决于你想达到什么。

你可以使用JButton#setContentAreaFilled传递假的,但你可能还需要调用JButton#setBorderPainted通过它落在

你也可以改变UIManager的默认值的按钮背景

+0

如果我们设置了'UIManager'的默认值,那么这个改变将会反映在所有'Jbuttons'.....没有办法改变只有一个'JButton'的背景吗? – 2013-04-10 21:08:35

+0

并非如此,同时保持'setContentAreaFilled'的按钮 – MadProgrammer 2013-04-10 21:24:50

+0

+1的外观。它看起来很有趣,用'WindowsLookAndFeel'虽然:) – tenorsax 2013-04-10 21:51:52