gpt4 book ai didi

java - PLAF 无法更改按钮颜色

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:58 24 4
gpt4 key购买 nike

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

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

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.plaf.ColorUIResource;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Demo extends JFrame {
public static void main(String[] args) {
new Demo();
}

public Demo() {
setTitle("PLAF button test");
final Demo thisWindow = this;
final JButton button = new JButton("Click me!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color curColor = UIManager.getColor("Button.background");
ColorUIResource targetColor;
if (curColor.equals(new Color(32, 32, 32))) {
targetColor = new ColorUIResource(192, 192, 192);
}
else {
targetColor = new ColorUIResource(32, 32, 32);
}
System.out.println("Setting new color to " + targetColor +
" because old color was " + curColor);
UIManager.put("Button.background", targetColor);
SwingUtilities.updateComponentTreeUI(thisWindow);
}
});
add(button);
setMinimumSize(new java.awt.Dimension(200, 200));
setVisible(true);
}
}

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

Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]

Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]

Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was javax.swing.plaf.ColorUIResource[r=192,g=192,b=192]

Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]

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

任何建议表示赞赏。感谢您的宝贵时间。

最佳答案

Is this an OS-dependent behavior somehow?

效果仅在 UI 委托(delegate)控制组件外观的意义上依赖于操作系统,并且每个支持的平台都定义了一个默认值 Look & Feel .在 Mac OS X 上,默认为 com.apple.laf.AquaLookAndFeel;这里是对应的source .如 UIManager Defaults 所示,引用 here“Button.background”UIManager 键的浅灰色​​值为

com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]

但分配的空间完全被 native 组件覆盖。类似的效果遮盖了为 “RadioBUtton.icon” 显示的浅粉色占位符。一些缓解策略:

  • 按照建议here ,您可以设置封闭的 JPanel 的背景。

  • 按照建议here ,您可以使用 setOpaque() 为背景着色一些darker() 阴影可能会有所帮助。

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

  • 使用控件,例如所见 here ,让用户选择喜欢的外观;将选择保留在 java.util.prefs.Preferences 的实例中。

  • 将用户引导至 Mac OS X 中的对比度选项 Accessibility系统偏好面板。

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

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

关于java - PLAF 无法更改按钮颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com