5

SWT ウィジェットで ID を自動的に生成して、UI テストでそれらを参照できるようにする方法はありますか? seData を使用して ID を手動で設定できることはわかっていますが、この機能を既存のアプリケーションにやや一般的な方法で実装したいと考えています。

4

1 に答える 1

8

Display.getCurrent().getShells();とを使用して、アプリケーション内のすべてのシェルに ID を再帰的に割り当てることができますWidget.setData();

ID の設定

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

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

メソッドを使用して、アプリケーション内のすべてのアクティブな (破棄されていない) シェルにアクセスできますDisplay.getCurrent().getShells();。メソッドを使用して、それぞれのすべての子をループし、それぞれShellに ID を割り当てることができます。ControlWidget.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;
        }
    }
}

Controlが複合内にコントロールを持っている可能性がある場合、Compositeそれが私の例で再帰的なソリューションを使用した理由です。


ID によるコントロールの検索

ここで、シェルの 1 つで Control を見つけたい場合は、同様の再帰的なアプローチをお勧めします。

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;
}

このメソッドを使用すると、 ID でfindControlById()簡単に見つけることができます。Control

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

リンク

于 2012-12-05T12:47:50.963 に答える