java listview刷新界面_java-小门使用ajax在不同面板中刷新listView

大家好,我是Wicket的新手,我开始玩这个框架.

我知道这将是一个非常无用的示例,但我尝试将其用于学习检票基础.

这是我的情况:

我得到一个页面IndexPage.java,该页面基本上由两个面板组成,第一个是ListCheesePanel.java(它基本上显示带有价格等的奶酪列表,以及用于将选择的奶酪添加到购物车的按钮),第二个一个是CartPanel.java,它本质上是一个购物车,您可以在其中拥有所有选定的奶酪,然后可以继续检出.

我基本上会使用ajax行为将列表中的奶酪添加到购物车中:

ListCheesePanel.java

public abstract class ListCheesePanel extends GenericPanel>{

private static final long serialVersionUID = 1L;

public ListCheesePanel(String id,final IModel> listCheeseModel) {

super(id,listCheeseModel);

PageableListView cheeses = new PageableListView("cheeses", listCheeseModel, 4) {

private static final long serialVersionUID = 1L;

@Override

protected void populateItem(final ListItem item) {

Cheese cheese = (Cheese) item.getModelObject();

item.addOrReplace(new Label("name", Model.of(cheese.getName())));

item.addOrReplace(new Label("description", Model.of(cheese.getDescription())));

item.addOrReplace(new Label("price", Model.of("$" + cheese.getPrice())));

item.addOrReplace(new AjaxFallbackLink("add",item.getModel()) {

private static final long serialVersionUID = 1L;

@Override

public void onClick(AjaxRequestTarget target) {

elementClicked(target, item.getModelObject());

}

});

}

};

addOrReplace(cheeses);

addOrReplace(new PagingNavigator("navigator", cheeses));

}

protected abstract void elementClicked(AjaxRequestTarget target,Cheese cheese);

}

elementClicked是必须使用ovverride的方法,以指示奶酪和目标.

CartPanel.java

public abstract class CartPanel extends GenericPanel{

private static final long serialVersionUID = 1L;

private WebMarkupContainer cartContainer;

private ListView cheesesList;

private Link checkOutLink;

private boolean checkOutButtonVisibility;

public CartPanel(String id,final IModel cartModel,final boolean checkOutButtonVisibility) {

super(id,cartModel);

this.checkOutButtonVisibility=checkOutButtonVisibility;

cartContainer = new WebMarkupContainer("cartContainer");

cartContainer.setOutputMarkupId(true);

addOrReplace(cartContainer);

cheesesList = new ListView("cart" , getModelObject().getCheeses()){

private static final long serialVersionUID = 1L;

@Override

protected void populateItem(final ListItem item) {

Cheese cheese = item.getModelObject();

item.addOrReplace(new Label("name",cheese.getName()));

item.addOrReplace(new Label("price",cheese.getPrice()));

item.addOrReplace(new Link("remove",item.getModel()) {

private static final long serialVersionUID = 1L;

@Override

public void onClick() {

removeElement(item.getModelObject());

}

});

}

};

cheesesList.setOutputMarkupId(true);

cartContainer.addOrReplace(cheesesList);

cartContainer.addOrReplace(new Label("total",new PropertyModel(cartModel.getObject(), "total")));

checkOutLink = new Link("checkOut",getModel()){

private static final long serialVersionUID = 1L;

@Override

public void onClick() {

setResponsePage(new CheckOutPage(getModel()));

}

@Override

protected void onConfigure() {

super.onConfigure();

Cart cart = cartModel.getObject();

List cheeseList = cart.getCheeses();

setVisible(isCheckOutButtonVisibility() && !cheeseList.isEmpty());

}

};

addOrReplace(checkOutLink);

}

protected abstract void removeElement(Cheese modelObject);

/* Getters and Setters */

public boolean isCheckOutButtonVisibility() {

return checkOutButtonVisibility;

}

}

IndePage.java

public class IndexPage extends CheeseTemplate {

private static final long serialVersionUID = 1L;

private static List cheeses = Arrays.asList(

new Cheese("Gouda", "Gouda is a yellowish Dutch[...]", 1.65),

new Cheese("Edam", "Edam (Dutch Edammer) is a D[...]", 1.05),

new Cheese("Maasdam", "Maasdam cheese is a Dutc[...]", 2.35),

new Cheese("Brie", "Brie is a soft cows' milk c[...]", 3.15),

new Cheese("Buxton Blue", "Buxton Blue cheese i[...]", 0.99),

new Cheese("Parmesan", "Parmesan is a grana, a [...]", 1.99),

new Cheese("Cheddar", "Cheddar cheese is a hard[...]", 2.95),

new Cheese("Roquefort", "Roquefort is a ewe's-m[...]", 1.67),

new Cheese("Boursin", "Boursin Cheese is a soft[...]", 1.33),

new Cheese("Camembert", "Camembert is a soft, c[...]", 1.69),

new Cheese("Emmental", "Emmental is a yellow, m[...]", 2.39),

new Cheese("Reblochon", "Reblochon is a French [...]", 2.99));

private IModel> allCheeseListModel;

private IModel cartModel;

private Cart cart;

public IndexPage() {

super();

allCheeseListModel = new ListModel(cheeses);

cart=new Cart();

cartModel = new Model(cart);

}

public IndexPage(IModel cartModel) {

super();

allCheeseListModel = new ListModel(cheeses);

this.cartModel=cartModel;

}

@Override

public Component getMainPanel() {

System.out.println("getMainPanel started");

return new ListCheesePanel(MAIN_PANEL_WICKET_ID,allCheeseListModel){

private static final long serialVersionUID = 1L;

@Override

protected void elementClicked(AjaxRequestTarget target,Cheese cheese) {

Cart cart = cartModel.getObject();

cart.getCheeses().add(cheese);

target.add(?????); // How can i get the cart container to update????

}

};

}

@Override

public Component getRightMenuPanel() {

CartPanel cartPanel = new CartPanel(RIGHT_MENU_PANEL_WICKET_ID,cartModel,true) {

private static final long serialVersionUID = 1L;

@Override

protected void removeElement(Cheese cheese) {

Cart cart = cartModel.getObject();

cart.getCheeses().remove(cheese);

}

};

cartPanel.setOutputMarkupId(true);

return cartPanel;

}

}

我的问题是:

如果该组件位于另一个面板中,如何获取该组件的引用以进行更新(因此,我认为示例中为cartContainer,因为我无法将listView组件直接添加到目标中)?

提前致谢

解决方法:

我真正想做的是处理事件.

我定义了这样的全局AjaxUpdateEvent:

AjaxUpdateEvent

public class AjaxUpdateEvent

{

public AjaxRequestTarget target;

public AjaxUpdateEvent( AjaxRequestTarget target )

{

this.target = target;

}

public AjaxRequestTarget getTarget()

{

return this.target;

}

}

然后,我将我感兴趣的事件子类化,例如CheeseAddedEvent扩展了AjaxUpdateEvent

然后,添加奶酪时需要执行某些操作的所有组件都具有onEvent()

OnEvent

@Override

public void onEvent( IEvent> event )

{

Object payload = event.getPayload();

@SuppressWarnings( "rawtypes" )

Class clazz = payload.getClass();

//or use isAssignableFrom() or instanceof or any method you like

if ( CheeseAddedEvent.class.equals( clazz ) )

{

CheeseAddedEvent e = ( (CheeseAddedEvent) payload );

e.target.add( this );

}

super.onEvent(event);

}

用法

....

public void onClick(AjaxRequestTarget target)

{

this.send( this.getPage(), Broadcast.BREADTH, new CheeseAddedEvent( target ) );

}

....

标签:ajax,listview,wicket,panel,java

来源: https://codeday.me/bug/20191120/2045290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值