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 回答