【问题标题】:Changing the background of JButton更改 JButton 的背景
【发布时间】:2013-04-10 20:26:40
【问题描述】:

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

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

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

我怎样才能将这个背景变成红色,同时仍将UIManager.getSystemLookAndFeelClassName() 用于其余组件/项目?

【问题讨论】:

  • 你的按钮有图标(图片)吗?如果是这样,背景会变成红色,但会被按钮的图标隐藏,给人的印象是只有“边框”发生了变化。
  • 嗯,即使没有图标,它仍然会发生,所以不是那样的。只要我有 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());只有边框改变颜色...

标签: java swing jbutton


【解决方案1】:

看看错误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,您可能会发现它很有用。

【讨论】:

  • 这已经很晚了,但我仍然觉得有必要留下一封感谢信。这对我有帮助。 :)
【解决方案2】:

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

你可以使用 JButton#setContentAreaFilled 传递它 false,但你可能还需要调用 JButton#setBorderPainted 传递它失败

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

【讨论】:

  • 如果我们设置UIManager的默认值,那么这个更改将反映在所有Jbuttons..有没有办法只改变一个JButton的背景?跨度>
  • 并非如此,同时保持按钮的外观
  • +1 表示setContentAreaFilled。不过WindowsLookAndFeel 看起来很有趣 :)
  • @VishalK 我确实认为您可以提供自己的 UI 委托,但这意味着您需要为您想要使用的每种可能的外观和感觉提供一个,这是很多工作
【解决方案3】:

您应该使JButton 不透明:

btnNewButton.setOpaque(true);

在 oracle 文档中为 JComponent#setBackground 方法指定:

设置此组件的背景颜色。背景颜色是 仅在组件不透明时使用,并且仅由 JComponent 或 ComponentUI 实现。的直接子类 JComponent 必须重写paintComponent 以支持此属性。

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

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

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2016-05-08
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多