0

別のスレッドで実行された操作に基づいてGUIコンポーネントを更新する必要がある場合があります。このために私は以下を持っています:

WebPageを拡張し、入力フィールド、フォーム、およびラベルを作成するクラス。フォームが送信されると、入力ファイルからのデータを処理するスレッドが開始され、AbstractAjaxTimerBehaviorがページに添付され、スレッドの進行状況/ステータスでラベルが更新されます。

ajaxタイマーのonTimer()メソッドでスレッドオブジェクトにアクセスできないため、作成時にクラスの参照をスレッドに渡します。次に、スレッドはクラスの変数(ステータス)を進行状況で更新します。ajaxタイマーは、ラベルの値をステータス値で更新します。

public int status;

@Override
public void onSubmit ()
{
    final Task task = new Task (ViewPage.this);
    Thread thread = new Thread (task);
    thread.start ();

    AbstractAjaxTimerBehavior timer = new AbstractAjaxTimerBehavior (Duration.milliseconds (1000))
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onTimer (AjaxRequestTarget target)
        {
            System.out.println ("> Progress [" + status + "]");

            if (status == x)
            {
               // refresh page
               setResponsePage (getPage().getClass ());
            }
        }
    };

    getPage().add (timer);
}

ajaxタイマーから直接スレッドオブジェクトにアクセスするか、クリーンな方法でラベルの値を更新する方法はありますか?

4

2 に答える 2

1

あなたが使用することができます:

http://wicket.apache.org/apidocs/1.4/org/apache/wicket/ajax/AjaxSelfUpdatingTimerBehavior.html

これを任意のコンポーネントにアタッチして、一定時間後に再レンダリングできると思います。

component.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(5)));

これは単に再レンダリングされ、リソースにアクセスしてラベルを更新できます。

セバスチャン

于 2012-10-09T13:31:31.727 に答える
0

私はここで良い答えを見つけました:Wicketカウントダウンタイマーは自己更新しません

ステータスメンバーを持つモデルクラスを作成しました。次に、このクラスのインスタンスを作成し、それをLabelのモデルとして設定し、それをスレッドに渡してステータス値を更新します。次に、onTimer()メソッドで、更新するラベルを追加します。

public class ProgressModel implements IModel<String>
{
    private static final long serialVersionUID = 1L;

    public String status;

    @Override
    public void detach ()
    {
        // TODO Auto-generated method stub
    }

    @Override
    public String getObject ()
    {
        return status;
    }

    @Override
    public void setObject (String object)
    {
        status = object;
    }
}

モデルインスタンスを作成し、Labelオブジェクトに設定します

pm = new ProgressModel ();
statusLbl = new Label ("statusLbl", pm);
statusLbl.setOutputMarkupId (true);

AbstractAjaxTimerBehaviorのonTimer()メソッドで、更新するLabelオブジェクトを設定するだけです。

@Override
protected void onTimer (AjaxRequestTarget target)
{
    target.add (statusLbl);
}

スレッドクラスには次のものがあります。

class Task implements Runnable
{
    public Task (ProgressModel progressModel)
    {
        this.pm = progressModel;
    }

    @Override
    public void run ()
    {
        // some operations
        pm.status = x;
    }
}
于 2012-10-09T14:54:11.773 に答える