Java 在Wicket中将DropDownChoice更改为ListView
我需要将CustomPagingPanel DropDownChoice中收集分页信息的地方(如[1-50]、[51-100])更改为ListView。因此我有一个代码:Java 在Wicket中将DropDownChoice更改为ListView,java,listview,wicket,dropdownchoice,Java,Listview,Wicket,Dropdownchoice,我需要将CustomPagingPanel DropDownChoice中收集分页信息的地方(如[1-50]、[51-100])更改为ListView。因此我有一个代码: // Ajax DropDownChoice used as Page navigator pagingDropDownChoice = new DropDownChoice("pagesDropDown", new PropertyModel(this, "currentPage"), new PropertyMod
// Ajax DropDownChoice used as Page navigator
pagingDropDownChoice = new DropDownChoice("pagesDropDown", new PropertyModel(this, "currentPage"), new PropertyModel(this, "pages"), new ChoiceRenderer("period", "pageNum"));
pagingDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
criteria.setPageNum((int)currentPage.getPageNum());
updatePagingList(target);
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(previousLink);
}
});
add(pagingDropDownChoice.setOutputMarkupId(true));
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
问题是Wicket中的DropDownChoice生成
标记,我需要HTML标记中的
标记 我仍然对你在这里想要实现的目标有点困惑,但我还是要冒险一试
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
如果我理解正确,您希望从DropDownChoice
,因为它必须应用于
标记,并将其更改为列表视图
,因为它处理列表。我的假设是,您只需要一个组件,该组件将以与下拉列表相同的方式生成选项(即列表中的项目将与下拉列表中的项目相同)
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
第一步是重新创建一个ListView,它将呈现与下拉列表相同的信息。也就是说,如果你有
<select>
<option>1-50</option>
<option>51-100</option>
</select>
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
一旦您将ID为的列表视图
附加到列表视图
,您的列表视图
将重复标记的次数与列表视图
模型中的项目相同,使您有机会每次配置标记的内部。现在,我不太确定您想要的内容是什么,以便它能够实现您想要的功能,但我假设它将是:
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
- 附加了ajax onClick行为的标签组件
- 链接组件
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
我假设“pages”属性是一个列表,其中列出了您从中确定可用页面的内容
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
现在应该在ListView的populateItem
方法中显示每个列表。因为我使用的示例是一个标签,所以必须以渲染器渲染选项的相同方式配置标签。我不确定这是如何实现的,所以我只假设它是模型ToString(因为您似乎没有提供模型类…)
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
您需要做的最后一部分是添加您想要的“onClick”行为。现在这部分有点自由了。您可以添加
AjaxEventBehavior
并对该行为的事件执行所需操作,也可以使用AjaxLink
组件而不是标签,然后在链接的onClick()
方法中执行相同操作。这是你的选择,但这相当简单。如果需要详细说明,请发表评论 @DomasPoliakas非常感谢,您的回答非常有帮助,我的Java代码如下:
public abstract class AjaxPagingPanel extends Panel{
private Criteria criteria;
private List<Page> pages;
private Page currentPage;
private long listSize;
private int pagesCount;
private DropDownChoice pagingDropDownChoice;
private Label pagingSizeLabel;
private AjaxLink previousLink;
private AjaxLink nextLink;
public AjaxPagingPanel(String id, Criteria pagingCriteria) {
super(id);
criteria = pagingCriteria;
listSize = criteria.getResultSize();
pagesCount = (int) Math.ceil((double) listSize / criteria.getPageSize());
long pageSize = pagingCriteria.getPageSize();
currentPage = new Page(pagingCriteria.getPageNum(), (pagingCriteria.getPageNum() - 1) * pageSize + 1, Math.min( pagingCriteria.getPageNum() * pageSize, pagingCriteria.getResultSize()) ); // Model for DropDownChoice
pages = new ArrayList(pagesCount);
for (int i = 0; i < pagesCount; i++) {
pages.add(new Page(i + 1, i * pageSize + 1, Math.min((i + 1) * pageSize, pagingCriteria.getResultSize()) ));
}
// Label updated by ajax to render listSize
pagingSizeLabel = new Label("pageSize", new PropertyModel(this, "listSize"));
add(pagingSizeLabel.setOutputMarkupId(true));
// Ajax DropDownChoice used as Page navigator
pagingDropDownChoice = new DropDownChoice("pagesDropDown", new PropertyModel(this, "currentPage"), new PropertyModel(this, "pages"), new ChoiceRenderer("period", "pageNum"));
pagingDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
criteria.setPageNum((int)currentPage.getPageNum());
updatePagingList(target);
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(previousLink);
}
});
add(pagingDropDownChoice.setOutputMarkupId(true));
add(previousLink = new IndicatingAjaxLink("previousLink"){
@Override
public void onClick(AjaxRequestTarget target) {
if (criteria.getPageNum() > 1) {
criteria.setPageNum(criteria.getPageNum() - 1);
int index = pages.indexOf(currentPage);
currentPage = pages.get(index - 1);
updatePagingList(target);
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(previousLink);
}
}
});
previousLink.setOutputMarkupPlaceholderTag(true);
// Next link of Page navigator
add(nextLink = new IndicatingAjaxLink("nextLink"){
@Override
public void onClick(AjaxRequestTarget target) {
if (criteria.getPageNum() < pagesCount) {
criteria.setPageNum(criteria.getPageNum() + 1);
int index = pages.indexOf(currentPage);
currentPage = pages.get(index + 1);
updatePagingList(target);
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(previousLink);
}
}
});
nextLink.setOutputMarkupPlaceholderTag(true);
setLinkVisibility();
}
public Page getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Page currentPage) {
this.currentPage = currentPage;
}
public final void setLinkVisibility() {
if (criteria.getPageNum() == 1) {
previousLink.setVisible(false);
} else {
previousLink.setVisible(true);
}
if (criteria.getPageNum() == pagesCount || pagesCount == 0) {
nextLink.setVisible(false);
} else {
nextLink.setVisible(true);
}
}
// Method must be overrided by a class which is using AjaxPagingPanel
public abstract void updatePagingList(AjaxRequestTarget target);
// Method to refresh the AjaxPagingPanel, for example after Ajax search
public void refresh(Criteria pagingCriteria, AjaxRequestTarget target) {
criteria = pagingCriteria;
listSize = criteria.getResultSize();
pagesCount = (int) Math.ceil((double) listSize / criteria.getPageSize());
long pageSize = pagingCriteria.getPageSize();
currentPage = new Page(pagingCriteria.getPageNum(), (pagingCriteria.getPageNum() - 1) * pageSize + 1, Math.min( pagingCriteria.getPageNum() * pageSize, pagingCriteria.getResultSize()) );
pages.clear();
for (int i = 0; i < pagesCount; i++) {
pages.add(new Page(i + 1, i * pageSize + 1, Math.min((i + 1) * pageSize, pagingCriteria.getResultSize()) ));
}
pagingDropDownChoice.modelChanged();
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(previousLink);
}
/**
* This class is used as a model class in DropDownChoice component and
* provides list of page as [1-50] [51-100] [101-150] [151-200]...
*/
public class Page implements Serializable{
private long pageNum;
private long firstPage;
private long lastPage;
public Page(long pageNum, long firstPage, long lastPage) {
this.pageNum = pageNum;
this.firstPage = firstPage;
this.lastPage = lastPage;
}
public long getPageNum() {
return pageNum;
}
public void setPageNum(long pageNum) {
this.pageNum = pageNum;
}
public String getPeriod() {
return Long.toString(firstPage) + "-" + Long.toString(lastPage);
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Page)){
return false;
}
return this.pageNum == ((Page)obj).pageNum;
}
@Override
public int hashCode() {
int hash = 7;
hash = 59 * hash + (int) (this.pageNum ^ (this.pageNum >>> 32));
return hash;
}
}
<table cellpadding="0" cellspacing="3" border="0">
<tr>
<td>
<span class="td2"> <wicket:message key="selected"/>: </span>
<span class="td1" wicket:id="pageSize"/> -
<a wicket:id="previousLink" class="listLink"><<<wicket:message key="previousPage"/> </a>
<select wicket:id="pagesDropDown" class="input"/>
<a wicket:id="nextLink" class="listLink"> <wicket:message key="nextPage"/>>></a>
</td>
</tr>
</table>
</wicket:panel>
公共抽象类AjaxPagingPanel扩展面板{
私人准则;
私人名单页;
私有页面当前页面;
私有长列表大小;
私人国际寻呼机;
私人下拉选择分页下拉选择;
专用标签pagingSizeLabel;
私有AjaxLink-previousLink;
私人AjaxLink nextLink;
公共AjaxPagingPanel(字符串id、条件pagingCriteria){
超级(id);
标准=分页标准;
listSize=criteria.getResultSize();
PageScont=(int)Math.ceil((double)listSize/criteria.getPageSize());
long pageSize=pagingCriteria.getPageSize();
currentPage=新页面(pagingCriteria.getPageNum(),(pagingCriteria.getPageNum()-1)*pageSize+1,Math.min(pagingCriteria.getPageNum()*pageSize,pagingCriteria.getResultSize());//DropDownChoice的模型
pages=新阵列列表(PageScont);
for(int i=0;i1){
criteria.setPageNum(criteria.getPageNum()-1);
int index=pages.indexOf(当前页面);
currentPage=pages.get(索引-1);
updatePagingList(目标);
setLinkVisibility();
target.add(pagingSizeLabel);
target.add(pagingDropDownChoice);
target.add(nextLink);
target.add(上一个链接);
}
}
});
setOutputMarkupPlaceholderTag(true);
//页面导航器的下一个链接
添加(nextLink=newindicatingajaxlink(“nextLink”){
@凌驾
公共void onClick(AjaxRequestTarget目标){
如果(criteria.getPageNum()