11

私はスイングアプリを書いていますが、いくつかのメソッドが実行されたときに「待機」カーソルが欲しいです。次の方法で実行できます。

public void someMethod() {
    MainUI.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    //method code
    MainUI.getInstance().setCursor(Cursor.getDefaultCursor());
}

私が達成したいのは、メソッドの実行前に待機カーソルを設定し、実行後に通常に戻すJavaアノテーションです。したがって、前の例は次のようになります

@WaitCursor    
public void someMethod() {
    //method code
}

どうすればこれを達成できますか? この問題を解決する他の方法についての提案も歓迎します。ありがとう!

PS - プロジェクトで Google Guice を使用していますが、それを使用して問題を解決する方法がわかりません。誰かが同様の問題の簡単な例を私に提供してくれれば、それは非常に役に立ちます

4

2 に答える 2

14

AspectJを使用することも、独自のAOPをもたらすGoogleGuiceを使用することもできます。

アノテーションが付けられたメソッドを持つオブジェクトには、WaitCursorGuiceを挿入する必要があります。

注釈を定義します

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface WaitCursor {}

MethodInterceptorを追加します:

public class WaitCursorInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // show the cursor
        MainUI.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        // execute the method annotated with `@WaitCursor`
        Object result = invocation.proceed();
        // hide the waiting cursor
        MainUI.getInstance().setCursor(Cursor.getDefaultCursor());
        return result;
    }
}

そして、アノテーションを持つ任意のメソッドでインターセプターをバインドするモジュールを定義します。

public class WaitCursorModule extends AbstractModule {
    protected void configure() {
        bindInterceptor(Matchers.any(), Matchers.annotatedWith(WaitCursor.class), new WaitCursorInterceptor());
    }
}

このページでより高度な使用法を見ることができます

于 2012-08-30T11:05:41.980 に答える
3

AspectJで around() アドバイスをアノテーションと組み合わせて使用​​して、around() アドバイスをアノテーションで修飾されたすべてのメソッドに関連付けることを検討することをお勧めします。

于 2012-08-30T10:50:49.290 に答える