当前位置: 首页 > 面试题库 >

在SWT小部件上自动生成ID

邓阳炎
2023-03-14
问题内容

有没有一种方法可以在SWT小部件上自动生成ID,以便UI测试可以引用它们?我知道我可以使用seData手动设置ID,但是我想以某种通用的方式为现有应用程序实现此功能。


问题答案:

您可以使用Display.getCurrent().getShells();和为应用程序中所有外壳递归分配ID Widget.setData();

设置ID

Shell []shells = Display.getCurrent().getShells();

for(Shell obj : shells) {
    setIds(obj);
}

您可以使用方法访问应用程序中所有活动的(未处置的)Shell
Display.getCurrent().getShells();。您可以遍历每个子项的所有子项,ShellControl使用方法为每个子项分配一个ID
Widget.setData();

private Integer count = 0;

private void setIds(Composite c) {
    Control[] children = c.getChildren();
    for(int j = 0 ; j < children.length; j++) {
        if(children[j] instanceof Composite) {
            setIds((Composite) children[j]);
        } else {
            children[j].setData(count);
            System.out.println(children[j].toString());
            System.out.println(" '-> ID: " + children[j].getData());
            ++count;
        }
    }
}

如果是,ControlComposite它可能在复合材料内部包含控件,这就是我在示例中使用递归解决方案的原因。

通过ID查找控件

现在,如果您想在其中一个外壳中找到控件,则建议采用类似的递归方法:

public Control findControlById(Integer id) {
    Shell[] shells = Display.getCurrent().getShells();

    for(Shell e : shells) {
        Control foundControl = findControl(e, id);
        if(foundControl != null) {
            return foundControl;
        }
    }
    return null;
}

private Control findControl(Composite c, Integer id) {
    Control[] children = c.getChildren();
    for(Control e : children) {
        if(e instanceof Composite) {
            Control found = findControl((Composite) e, id);
            if(found != null) {
                return found;
            }
        } else {
            int value = id.intValue();
            int objValue = ((Integer)e.getData()).intValue();

            if(value == objValue)
                return e;
        }
    }
    return null;
}

使用此方法,findControlById()您可以轻松找到ControlID的ID。

    Control foundControl = findControlById(12);
    System.out.println(foundControl.toString());

链接

  • SWT API:小部件
  • SWT API:显示


 类似资料:
  • 问题内容: 有人知道如何从1开始生成,以便下一个对象具有2,依此类推吗? 我尝试了以下方法,但不起作用: 问题答案: 您需要一个 静态的 类成员来跟踪上次使用的索引。确保还实现一个复制构造函数: 更新: 正如@JordanWhite建议的那样,您可能希望使static计数器成为 atomic ,这意味着可以安全地同时使用(即一次在多个线程中使用)。为此,将类型更改为: 增量读取和复位操作变为:

  • 问题内容: 我试图在单击按钮时将诸如文本框,按钮之类的小部件添加到组合中。我已经尝试过了,但是我只能动态地添加这些小部件,最多不超过组合的大小。我的jface对话框是这样的,它具有滚动的复合文件,其中包含复合文件。在主要组合中,我还必须实现此功能的其他3个组合,因此,如果我向组合添加动态小部件,则它可能会扩展,但不应将现有组合叠加到该组合上,而应相应地调整其他组合,并且我应该能够在单击按钮时处理这

  • 问题内容: Qt解决方案是对 resizeColumnsToContent() 的单个调用,在.NET中,可以使用 TextRenderer.MeasureText() ,而JTable可以使用 AUTO_RESIZE_ALL_COLUMNS 。 在SWT中,是否有一种方法可以在填充列之后以编程方式调整列的大小? 调用将返回相同的值,因此将忽略列中剩余的字符。 TableColumn具有,但是如何

  • 为了重现我的问题,可以简单地使用这个最小的生成器: 我的项目回购是:(工作区是一个空文件) 生成文件是 声明的输出“My lib/file.cpp”不是由GenRule创建的。这可能是因为genrule实际上没有创建此输出,或者因为输出是一个目录,并且genrule是远程运行的(注意,只有声明的文件输出的内容是从远程运行的genrules复制的) 问题(B),处理cc_library()部分 我不

  • 是否有任何方法要求intellij创建的自动生成方法在类的末尾生成?当前,当我生成一个方法时(⌥⌘M) 它是在我从中提取方法的函数的正下方创建的,我希望它位于文件的末尾 intellij是否提供该选项?