/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.wicket.examples.events; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.event.Broadcast; import org.apache.wicket.event.IEvent; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.PropertyModel; /** * @author igor */ public class DecoupledAjaxUpdatePage extends BasePage { private int counter; /** * Construct. */ public DecoupledAjaxUpdatePage() { // add a counter label add(new CounterLabel("label1")); // add another counter label inside a container WebMarkupContainer container = new WebMarkupContainer("container"); add(container); container.add(new CounterLabel("label2")); // add a form Form<?> form = new Form<>("form"); add(form); // add the textfield that will update the counter value form.add(new TextField<>("counter", new PropertyModel<>(this, "counter"), Integer.class).setRequired(true)); // add button that will broadcast counter update event form.add(new AjaxButton("submit") { @Override protected void onSubmit(AjaxRequestTarget target) { send(getPage(), Broadcast.BREADTH, new CounterUpdate(target)); } }); } /** * An event payload that represents a counter update */ public class CounterUpdate { private final AjaxRequestTarget target; /** * Constructor * * @param target */ public CounterUpdate(AjaxRequestTarget target) { this.target = target; } /** @return ajax request target */ public AjaxRequestTarget getTarget() { return target; } } /** * A label that renders the value of the page's counter variable. Also listens to * {@link CounterUpdate} event and updates itself. * * @author igor */ public class CounterLabel extends Label { /** * Construct. * * @param id */ public CounterLabel(String id) { super(id, new PropertyModel<>(DecoupledAjaxUpdatePage.this, "counter")); setOutputMarkupId(true); } @Override public void onEvent(IEvent<?> event) { super.onEvent(event); // check if this is a counter update event and if so repaint self if (event.getPayload() instanceof CounterUpdate) { CounterUpdate update = (CounterUpdate)event.getPayload(); update.getTarget().add(this); } } } }