Eclipse SWT:如何从 getStyle() 中取消屏蔽样式组合

Eclipse SWT: How to unmask style combination from getStyle()

这适用于标准 Eclipse SWT(在 RCP 中)。假设我有一个 shell

Shell shell = new Shell(parent);

我可以从方法 shell.getStyle() 中获取样式值。假设它是 33555696。那么我怎样才能得到这个值的实际样式组合呢?即,如何检索原始样式定义 SWT.CLOSE | SWT.TITLE ...?

我从这个博客得到了一些帮助 http://blog.vogella.com/2011/01/25/swt-style-bits/ 它告诉我如何检查特定样式,但我仍然不知道如何获得组合。谢谢

按位或值不是 EnumSet。它本身不包含样式常量。它只包含常量的,结合按位或。

此外,多个样式常量具有相同的值。不同的常量适用于不同的上下文。例如,值 1<<4 用于样式常量 SWT.RADIOSWT.SHADOW_ETCHED_INSWT.RESIZESWT.NO_SCROLLSWT.PHONETICSWT.ICON_WORKING.

对于特定的上下文,您可以逐个测试其合法样式常量。由此,您可以生成产生该值的代码。

SWTSpy 工具是您的好帮手,它会告诉您文字中的样式位是什么,请参阅下面的演示和安装说明。

但是,对于您的特定问题,您可能需要将样式位转换为字符串的 SWTSpy 源。 @AndyThomas 是正确的,对于每种类型的控件,样式位可能具有不同的含义。这就是为什么 SWTSpy 有一个巨大的 if/else 链来为您解决它。

这是一个示例:

if ((style & 1 << 3) != 0) {
        if (w instanceof Menu) {
                result += "POP_UP | ";
        } else if (w instanceof Button || w instanceof MenuItem || w instanceof ToolItem) {
                result += "PUSH | ";
        } else if (w instanceof Combo || w instanceof Text || w instanceof StyledText) {
                result += "READ_ONLY | ";
        } else if (w instanceof Label || w instanceof Group || w instanceof ToolBar) {
                result += "SHADOW_OUT | ";
        } else if (w instanceof Decorations) {
                result += "NO_TRIM | "; 
        } else {
                result += "POP_UP or PUSH or READ_ONLY or SHADOW_OUT or NO_TRIM or NATIVE | ";
        }
}

如果需要,您可以将 that code 合并到您的代码中。

使用 SWT 间谍

安装 SWT Spy 后(见下文):

  1. 打开视图 (Window -> Show View -> Other -> SWT Spy)
  2. 开启间谍 Ctrl+Alt+Shift+ . 或按视图顶部的按钮。
  3. 将鼠标悬停在感兴趣的控件上
  4. 检查其所有属性,包括样式位
  5. 为了 "freeze" 间谍停止跟踪鼠标,按 Ctrl+Alt+再次 Shift+..

这是一个屏幕截图,显示突出显示的添加按钮具有样式:PUSH | FLAT | CENTER | LEFT_TO_RIGHT | DOUBLE_BUFFERED

安装

如何安装 SWTSpy(SWT 工具的一部分):

  1. Help -> Install New Software
  2. 选择The Eclipse Project Updates
  3. 在筛选框中键入 swt tools(如下面的屏幕截图所示)
  4. 完成向导