我有一个案例需要根据在另一个线程中执行的操作来更新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定时器或干净的方式访问线程对象来更新标签的值?
答案 0 :(得分:1)
您可以使用:
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/ajax/AjaxSelfUpdatingTimerBehavior.html
我认为您可以将此附加到任何组件以在一段时间后重新渲染:
component.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(5)));
这将只是重新呈现,您可以访问您的资源并更新标签。
塞巴斯蒂安
答案 1 :(得分:0)
我在这里找到了一个很好的答案:Wicket countdown timer will not self-update
我创建了一个具有status成员的模型类。然后创建此类的实例并将其设置为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;
}
}