You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows高对比度模式下如何检测主题颜色信息(含背景色)

检测Windows高对比度主题的颜色信息

好问题!你已经通过Toolkit成功检测到高对比度模式的开启状态,接下来要获取主题的颜色信息(比如背景色)来适配JButton的图标,其实可以继续利用Windows提供的桌面属性来实现,下面是具体的方案:

1. 直接获取高对比度主题的颜色属性

Windows为Java提供了一系列针对高对比度主题的桌面属性,你可以通过Toolkit.getDesktopProperty()直接获取这些值,关键属性包括:

  • win.highContrast.colorBackground:当前高对比度主题的背景色,返回Color对象
  • win.highContrast.colorText:当前高对比度主题的文本颜色,返回Color对象
  • win.highContrast.theme:当前高对比度主题的名称(比如"High Contrast Black"、"High Contrast White"),返回字符串

代码示例

Toolkit toolkit = Toolkit.getDefaultToolkit();
Boolean highContrast = (Boolean) toolkit.getDesktopProperty("win.highContrast.on");

if (highContrast != null && highContrast) {
    // 获取背景色
    Color bgColor = (Color) toolkit.getDesktopProperty("win.highContrast.colorBackground");
    // 获取文本颜色(可选,辅助判断)
    Color textColor = (Color) toolkit.getDesktopProperty("win.highContrast.colorText");
    // 获取主题名称(可选)
    String themeName = (String) toolkit.getDesktopProperty("win.highContrast.theme");
    
    // 根据背景色切换JButton图标
    if (bgColor != null) {
        // 针对纯黑/纯白主题的判断
        if (bgColor.equals(Color.BLACK)) {
            button.setIcon(new ImageIcon("white_icon.png"));
        } else if (bgColor.equals(Color.WHITE)) {
            button.setIcon(new ImageIcon("black_icon.png"));
        } 
        // 兼容非纯黑纯白的高对比度主题(比如灰色背景)
        else {
            // 通过亮度判断背景深浅:亮度>128为浅色,反之为深色
            double brightness = 0.299 * bgColor.getRed() + 0.587 * bgColor.getGreen() + 0.114 * bgColor.getBlue();
            if (brightness > 128) {
                button.setIcon(new ImageIcon("dark_icon.png"));
            } else {
                button.setIcon(new ImageIcon("light_icon.png"));
            }
        }
    }
} else {
    // 高对比度关闭时,恢复正常图标
    button.setIcon(new ImageIcon("normal_icon.png"));
}

2. 监听高对比度模式的动态变化

用户可能在程序运行过程中切换高对比度主题,所以建议添加属性监听器,实时响应状态变化:

Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addPropertyChangeListener("win.highContrast.on", evt -> {
    Boolean newState = (Boolean) evt.getNewValue();
    // 触发UI更新逻辑
    updateButtonIconForHighContrast(newState);
});

// 封装更新逻辑为单独方法
private void updateButtonIconForHighContrast(Boolean isHighContrastEnabled) {
    if (isHighContrastEnabled != null && isHighContrastEnabled) {
        Color bgColor = (Color) Toolkit.getDefaultToolkit().getDesktopProperty("win.highContrast.colorBackground");
        // 同上面的颜色判断逻辑...
    } else {
        button.setIcon(new ImageIcon("normal_icon.png"));
    }
}

注意事项

  • 这些属性是Windows系统专属的,在非Windows平台(比如Linux、macOS)调用会返回null,所以一定要做好空值检查,避免空指针异常。
  • 部分自定义高对比度主题的颜色可能不是系统默认的纯黑/纯白,使用亮度判断的方式能更好地适配这类场景。

内容的提问来源于stack exchange,提问作者anguspcw

火山引擎 最新活动