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(); });
原因说明
redraw()的作用是通知操作系统重新绘制控件的视觉内容,但不会触发CSS规则的重新计算——它不知道你修改了控件的CSS类名。ThemeEngine.applyStyles()会让CSS引擎重新检查控件的所有样式相关属性(包括你通过setData设置的CSS类名),匹配对应的CSS规则,更新控件的样式属性,之后再调用redraw()就能让新样式显示出来。
注意事项
确保你的项目依赖了E4 CSS SWT主题相关的插件(比如org.eclipse.e4.ui.css.swt.theme),否则无法导入ThemeEngine类。
内容的提问来源于stack exchange,提问作者Bourbon_7
相关产品推荐
相关产品推荐

