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