首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类中的Timer方法中显示HTML标记组件

如何在类中的Timer方法中显示HTML标记组件
EN

Stack Overflow用户
提问于 2017-07-19 10:59:38
回答 3查看 124关注 0票数 0

在计时器事件中,我希望再次使组件可见。有什么不同的方法来完成这个任务吗?我给她戴上了吊带。

HTML标记:在这个文件中,我创建了警报栏

代码语言:javascript
复制
  <div Class="row" wicket:id="alert_app" >
      <div  class="alert alert-info" role="alert" style="top: 2%; left: 50%; position: absolute;">
      <a href="#" wicket:id="alert" style="color:red"  >Alert - Match Found</a>

     </div>
    </div>    

Java :我实例化了WebMarkupContainer并使其在初始阶段变得不可见,在5秒警报栏出现后(这是我的计划),我使用了Timer,并在timer事件中卡住了。

代码语言:javascript
复制
 WebMarkupContainer informationBox = new WebMarkupContainer("alert_app");
     add(informationBox);

        final AjaxLink saveProfile = new AjaxLink("alert") {

        private static final long serialVersionUID = 1L;

        public void onClick(AjaxRequestTarget target) {

            this.setResponsePage(ABC.class);
        }

    };

    informationBox.add(saveProfile);
    informationBox.setVisible(false);  

    Timer timer = new Timer();

    timer.schedule(new TimerTask() {

        @Override
        public void run() {

            informationBox.setVisibilityAllowed(true);

            informationBox.setVisible(true);   // I got error in this line

        }
    }, 5000);

错误:

代码语言:javascript
复制
   12:37:04,735 INFO  
  [org.apache.wicket.response.filter.AjaxServerAndClientTimeFilter] (http-
   localhost-127.0.0.1-8080-4) 1ms server time taken for request 
wicket/bookmarkable/xyz.abc.vbn.class?
4&username=user+name response size: 9386
12:37:09,736 ERROR [stderr] (Timer-3) Exception in thread "Timer-3" 
org.apache.wicket.WicketRuntimeException: No RequestCycle is currently set!

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.Component.getRequest(Component.java:1791)

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.markup.html.WebPage.dirty(WebPage.java:334)

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.Page.dirty(Page.java:248)

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.Page.componentStateChanging(Page.java:937)

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.Component.addStateChange(Component.java:3512)

12:37:09,736 ERROR [stderr] (Timer-3)   at 
org.apache.wicket.Component.setVisible(Component.java:3195)


 12:37:09,736 ERROR [stderr] (Timer-3)  at 
 java.util.TimerThread.mainLoop(Timer.java:555)

 12:37:09,736 ERROR [stderr] (Timer-3)  at 
 java.util.TimerThread.run(Timer.java:505)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-19 12:01:14

您不能只使用java.util.Timer。它启动一个不是HTTP线程的新线程,因此WicketFilter没有机会设置ThreadLocal(应用程序、会话和RequestCysle)。

您必须使用org.apache.wicket.ajax.AbstractAjaxTimerBehavior代替。在给定的持续时间之后,它将触发一个新的Ajax请求,一切都将如预期的那样工作!

票数 3
EN

Stack Overflow用户

发布于 2017-07-19 11:45:43

我不确定,但我看不出代码

代码语言:javascript
复制
informationBox.setOutputMarkupId(true);
informationBox.setOutputMarkupPlaceholderTag(true)
票数 0
EN

Stack Overflow用户

发布于 2017-07-21 11:55:10

我把我的答案放在这里,这样它可以帮助观众,谢谢@阿列克谢和马丁,你们俩的回答很有帮助。

代码语言:javascript
复制
 WebMarkupContainer informationBox = new WebMarkupContainer("alert_app");
 informationBox.add(new AjaxLink("alert1"){

        @Override
        public void onClick(AjaxRequestTarget target) {
            // TODO Auto-generated method stub
            this.setResponsePage(ABC.class);
        } });

    add(informationBox);
    informationBox.setOutputMarkupId(true);
    informationBox.setOutputMarkupPlaceholderTag(true);


   informationBox.setVisible(false);

   this.add(new AbstractAjaxTimerBehavior(Duration.seconds(5))
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onTimer(AjaxRequestTarget target)
        {
            target.add(informationBox.setVisible(true));
            System.out.println("on timer");

            stop(target);
        }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45188579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档