Java PLAF can';不要改变按钮的颜色
我们有一个可以在“白天”(高对比度)和“夜间”(低对比度)模式之间切换的程序。这是通过动态更改外观和感觉来实现的。它几乎适用于所有组件,但有一些组件忽略了背景颜色的更改。特别是,我注意到按钮、组合框和表头都忽略了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上,默认值是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.
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 }
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
}