Java PLAF can';不要改变按钮的颜色

Java PLAF can';不要改变按钮的颜色,java,swing,colors,look-and-feel,Java,Swing,Colors,Look And Feel,我们有一个可以在“白天”(高对比度)和“夜间”(低对比度)模式之间切换的程序。这是通过动态更改外观和感觉来实现的。它几乎适用于所有组件,但有一些组件忽略了背景颜色的更改。特别是,我注意到按钮、组合框和表头都忽略了PLAF中的更改 下面是一个带有按钮的示例程序。我做错什么了吗?这是一种依赖操作系统的行为吗?(我在OSX上) 这是我运行这个程序并点击按钮时得到的输出: 将新颜色设置为javax.swing.plaf.ColorUIResource[r=32,g=32,b=32],因为旧颜色是com.

我们有一个可以在“白天”(高对比度)和“夜间”(低对比度)模式之间切换的程序。这是通过动态更改外观和感觉来实现的。它几乎适用于所有组件,但有一些组件忽略了背景颜色的更改。特别是,我注意到按钮、组合框和表头都忽略了PLAF中的更改

下面是一个带有按钮的示例程序。我做错什么了吗?这是一种依赖操作系统的行为吗?(我在OSX上)

这是我运行这个程序并点击按钮时得到的输出:

将新颜色设置为javax.swing.plaf.ColorUIResource[r=32,g=32,b=32],因为旧颜色是com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]

将新颜色设置为javax.swing.plaf.ColorUIResource[r=192,g=192,b=192],因为旧颜色是javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]

将新颜色设置为javax.swing.plaf.ColorUIResource[r=32,g=32,b=32],因为旧颜色是javax.swing.plaf.ColorUIResource[r=192,g=192,b=192]

将新颜色设置为javax.swing.plaf.ColorUIResource[r=192,g=192,b=192],因为旧颜色是javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]

因此UIManager认为颜色正在改变,但屏幕上的外观颜色没有改变

谢谢你的建议。谢谢你抽出时间

这是一种依赖操作系统的行为吗

这种效果仅在UI委托控制组件外观的意义上取决于操作系统,并且每个受支持的平台都定义了一个默认值。在Mac OS X上,默认值是
com.apple.laf.AquaLookAndFeel
;这里是相应的。如引用的UIManager默认值所示,
“Button.background”
UIManager
键的浅灰色值为

com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
但分配的空间完全由本机组件覆盖。类似的效果会遮挡为
“RadioBUtton.icon”
显示的浅粉色占位符。一些缓解策略:

  • 根据建议,您可以设置封闭的
    JPanel
    的背景

  • 根据建议,您可以使用
    setOpaque()
    对一些背景进行着色;较暗的色调可能会有所帮助

    JButton b = new JButton("Test");
    b.setOpaque(true);
    b.setBackground(Color.red.darker());
    
  • 如果使用,请记住“将组件放入
    JPanel
    并在
    JPanel
    上设置边框”

  • 使用一个控件,例如所看到的控件,让用户选择首选的外观和感觉;在
    java.util.prefs.Preferences
    的实例中保留该选项

  • 引导用户使用Mac OS X系统首选项面板中的对比度选项

  • 将特定于平台的代码包装在适当的谓词中

    if (System.getProperty("os.name").startsWith("Mac OS X")) {
        // Specific to Mac OS X
    }
    

我见过JButton背景色的Mac特定渲染问题-这些问题是通过setBackgroundColor方法而不是UIManager产生的,但根本原因可能是相同的。很抱歉,现在手头没有mac可供测试,但请尝试将border Paint属性设置为false。请看,我尝试添加setOpaque(false)和setbOrderPaint(false),但它们不允许通过PLAF更改(或者通过手动setBackground()调用)来更改背景色。此外,在Windows上,我们在按钮、表格标题等方面也看到了类似的问题。您能给出您正在使用的LAF的完全限定名称(如
com.sun.java.swing.plaf.gtk.GTKLookAndFeel
)吗?我特别不想从头开始创建新的LAF,因为我们希望使用与操作系统相关的组件,而只是覆盖特定的属性(通常是背景色)。在我的笔记本电脑上,这意味着我最终会得到一个修改后的运行时版本com.apple.laf.AquaLookAndFeel,但在Windows机器或Linux机器上会有所不同。@user3421216尝试使用方法
JButton.setContentAreaFilled(true)
(方法在父
AbstractButton
中定义)。可能Mac L&F将其设置为false,因此按钮不会绘制整个内容。我没有Mac,因此无法测试它是否工作。啊,好吧,这解释了很多。所以我实际上要更改的是“本机组件”的颜色在这种情况下,我们遇到的问题是在夜间模式下,所有东西都有一个深色背景,深色背景上按钮的浅色非常明显。是否有一些平台适应性的方法来确定PLAF使用什么来渲染按钮“前景”并覆盖它们的颜色?所以在OSX上,我会有一个深色的浅绿色按钮,在Windows上有一些合适的替代品,等等@user3421216:对不起,我不知道有这样的方法;我已经扩展了上面的替代品列表。好的,谢谢你的努力。它看起来像是我想要的方法,按钮的外观看起来很逼真整个程序可以很容易地在运行中进行调整,如果不更换我们的(可能超过100个),这是不可能的带有自定义控件的按钮,这些按钮具有自定义操作系统特定的渲染功能,并向可以根据需要更改其颜色的中央机构注册。不幸的是,我现在没有能力实现这种更改。我将继续,并将您标记为已回答了问题。谢谢again@user3421216:我想加一个n用于测试,并推荐类似的L&F。
if (System.getProperty("os.name").startsWith("Mac OS X")) {
    // Specific to Mac OS X
}