0

GUI アプリケーションを開始するテスト フレームワークを作成しています。SWT アプリケーションの場合にこの GUI をテストできるようにするには、それがディスプレイであることを知る必要があります。通常、この表示は別のクラスローダによってロードされるため、swt Display クラスのメソッド findDisplay(Thread t) をリフレクションによって使用して、このタスクを実行しています。私のコードは次のようになります。

Thread[] threads = new Thread[10];
Thread.enumerate(threads);
Object foundObject = null;
for (Thread t : Arrays.asList(threads)){
    foundObject = null;
    Class<?> clazz = t.getContextClassLoader().loadClass("org.eclipse.swt.widgets.Display");
    final Method method = clazz.getMethod("findDisplay", Thread.class);
    foundObject = method.invoke(null, new Object[] {t});
    if (foundObject != null) {
        System.out.println("yeah, found it!");
        break;
    }
}

私の意見では、これにより、現在のスレッド グループ内のタイプ Display のすべてのオブジェクトが検出されるはずです。ただし、GUI は完全に起動していますが、texteditor RCP の例では何も得られません。

何がうまくいかないのか、またはこれを合理的な方法でデバッグする方法はありますか?

4

2 に答える 2

0

Eclipse RCPを使用している場合は、次を使用できます。

PlatformUI.getWorkbench()。getDisplay()

于 2009-06-09T12:01:18.287 に答える
0

主な問題が何であるかを突き止めました。ContextClassloader は、実際にクラスをロードしたクラスローダーとは何の関係もありませんでした。

私の問題を解決するために、RCP プログラムの階層とフレームワークの階層の両方で、swt 表示クラスをロードするクラスローダーを用意しました。これは、Java 拡張クラスローダーを使用することで可能になりました。(RCP アプリケーションが親として動作しないため、アプリケーション クラスローダーを使用できませんでした。理由はまだわかりません) その後、swt.jar を java.ext.dirs に追加するだけでした財産。

于 2009-05-20T11:15:37.163 に答える