You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse SWT中调用redraw()为何无法重新应用CSS样式?

SWT动态修改CSS Class后样式不更新的解决办法

你遇到的核心问题是:redraw()只负责触发控件重绘,不会让CSS引擎重新解析并应用新的样式规则。SWT的CSS样式默认在控件初始化时解析一次,动态修改CSS类名后,需要主动通知样式引擎重新计算样式。

解决步骤

修改你的选择监听器代码,在设置CSS类名后,通过ThemeEngine强制重新应用样式,而不是只调用redraw():

import org.eclipse.e4.ui.css.swt.theme.ThemeEngine;

// ... 原有代码 ...

button.addListener(SWT.Selection, e -> {
    if (button.getSelection()) {
        button.setData(CSSSWTConstants.CSS_CLASS_NAME_KEY, "selected");
    } else {
        button.setData(CSSSWTConstants.CSS_CLASS_NAME_KEY, null);
    }
    
    // 获取当前主题引擎,强制重新应用样式
    ThemeEngine themeEngine = (ThemeEngine) Display.getCurrent().getData(ThemeEngine.THEME_ENGINE_KEY);
    if (themeEngine != null) {
        themeEngine.applyStyles(button, true);
    }
    
    button.redraw();
});

原因说明

  1. redraw()的作用是通知操作系统重新绘制控件的视觉内容,但不会触发CSS规则的重新计算——它不知道你修改了控件的CSS类名。
  2. ThemeEngine.applyStyles()会让CSS引擎重新检查控件的所有样式相关属性(包括你通过setData设置的CSS类名),匹配对应的CSS规则,更新控件的样式属性,之后再调用redraw()就能让新样式显示出来。

注意事项

确保你的项目依赖了E4 CSS SWT主题相关的插件(比如org.eclipse.e4.ui.css.swt.theme),否则无法导入ThemeEngine类。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:45:20