2

MyCompositeサイズの変更をアニメーション化したいクラスがあります。
そのために、ループでサイズを変更しています。
各ループ処理の後、 を呼び出しますlayout()

残念ながら、コンポジットは反復ごとに再描画されませんが、コンポジットの最終サイズに直接ジャンプします。

サイズが変更されるたびにウィジェットを強制的に再描画するにはどうすればよいですか?

MyComposite とアニメーション:



//start
new Animation().start(myComposite);

...

public MyComposite(Composite parent, int style, int bgcolor) {
        super(parent, style);
        this.setBackground(getDisplay().getSystemColor(bgcolor));       
    }

    @Override
    public Point computeSize(int wHint, int hHint, boolean changed) {
        return super.computeSize(width, height, changed);
    }


    class Animation{
        public void start(MyComposite composite){
            for(int i=0; i<1000; i++){
                composite.width++;
                composite.getParent().layout(true, true);
            }
        }
    }


マイコンポジット:

4

2 に答える 2

5

再描画は次のように機能します。

  • layout()マークは、すべての複合子の再配置を強制します。これは、コンポジットの画面領域が再描画されるときに、将来どこかで行われる次の再描画で表示されます。
  • redraw()は、ウィジェットを無効としてマークします。次の redraw-system-action で、この領域は再描画されます。
  • update()は、すべての未処理の redraw() リクエストを今すぐ完了するように強制します。

したがって、問題は、再描画要求をすぐに実行するようにトリガーしなかったことです。正しいアニメーション関数は次のようになります。


//layout of the composite doesn't work
//composite.layout(true, true);

//layout of parent works
composite.getParent().layout(true, true);

//marks the composite's screen are as invalidates, which will force a 
composite.redraw(); redraw on next paint request 

//tells the application to do all outstanding paint requests immediately
composite.update(); 


于 2012-08-26T13:48:13.803 に答える
0

あなたの問題は、すべてが単一のディスプレイスレッドで実行されていることだと思います。コードが width++ と .layout をすばやく呼び出し、その呼び出しが終了し、最終的にディスプレイ スレッドが実際に .layout を実行する機会が与えられます。

独自のスレッドで実行される java.util.Timer を確認し、Display.getDefault().asyncExec または .syncExec を使用してこれらのイベントをディスプレイ スレッドのキューに戻すことをお勧めします。

于 2012-08-25T22:49:12.683 に答える