Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 Primefaces ColumnToggler没有';不使用分页_Jsf 2_Primefaces_Pagination - Fatal编程技术网

Jsf 2 Primefaces ColumnToggler没有';不使用分页

Jsf 2 Primefaces ColumnToggler没有';不使用分页,jsf-2,primefaces,pagination,Jsf 2,Primefaces,Pagination,我有一个datatable以及sort、filter和Columntogler。 首先,当我在同一页中选择和取消选择一列时,一切都很好 正如你所看到的,我的第一个专栏已经不见了 这里的问题是,当我使用分页工具转到下一页时,如果我想取消选择列,它只显示列标题,而不显示它们的行,如下图所示: 初始隐藏列现在显示,但我们有一个间隙。最后一列现在为空,第一列将值带到第二列 这是我的数据表结构: <p:dataTable id="datatable" var="mon" value="#{X.r

我有一个datatable以及sort、filter和Columntogler。 首先,当我在同一页中选择和取消选择一列时,一切都很好

正如你所看到的,我的第一个专栏已经不见了

这里的问题是,当我使用分页工具转到下一页时,如果我想取消选择列,它只显示列标题,而不显示它们的行,如下图所示: 初始隐藏列现在显示,但我们有一个间隙。最后一列现在为空,第一列将值带到第二列

这是我的数据表结构:

<p:dataTable id="datatable" var="mon" value="#{X.resultQuery}" 
                         first="#{dataTableController.first}"
                         resizableColumns="true"
                         rows="20"
                         paginator="true"
                         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                         rowsPerPageTemplate="30,40,50"
                         draggableColumns="true"
                         paginatorPosition="bottom" 
                         selectionMode="single" rowKey="#{mon[4]}"
                         >   
                <f:facet name="header">
                    <p:commandButton id="toggler" type="button" value="Hide Columns" icon="ui-icon-calculator" />
                    <p:columnToggler datasource="datatable" trigger="toggler">
                        <p:ajax event="toggle"  listener="#{columnTogglerController.onToggle}" />
                    </p:columnToggler>
                </f:facet>

这是我的ColumnTogglerController:

public class ColumnTogglerController implements Serializable {

private List<Boolean> list;

/**
 * Creates a new instance of ColumnTogglerController
 */
public ColumnTogglerController() {
}

public List<Boolean> getList() {
    return list;
}

public void setList(List<Boolean> list) {
    this.list = list;
}

@PostConstruct
public void init() {
    setList(Arrays.asList(true, true, true, true, true, true, true, true, true, true, true));
}

public void onToggle(ToggleEvent e) {
    list.set((Integer) e.getData(), e.getVisibility() == Visibility.VISIBLE);

}
public类ColumnTogglerController实现可序列化{
私人名单;
/**
*创建ColumnTogglerController的新实例
*/
公共列TogglerController(){
}
公共列表getList(){
退货清单;
}
公共无效集合列表(列表){
this.list=列表;
}
@施工后
公共void init(){
setList(Arrays.asList(真,真,真,真,真,真,真,真,真,真,真,真));
}
公共无效切换(切换事件){
list.set((整数)e.getData(),e.getVisibility()==Visibility.VISIBLE);
}
}

基本上,我的计划基于以下博客:


谢谢你的帮助。

我最近碰巧遇到了这个问题。这个方法实际上是有效的。问题是
draggableColumns=“true”
使列的索引发生更改。因此,我使用了两张地图来代替列表:

private final Map<String, Boolean> colVisibilityMap = new HashMap<>();
private final Map<Integer, String> colIndexMap = new HashMap<>();
private final Map colVisibilityMap=new HashMap();
私有最终映射colIndexMap=newhashmap();
在初始化期间,我设置了colIndexMap和colVisibilityMap(并且我使用id/clientId作为键)。 在列重新排序时,我更新colIndexMap。 在toggle上,我在colIndexMap上更新colVisibilityMap

public Map<String, Boolean> getColVisibilityMap() {
    return Collections.unmodifiableMap(colVisibilityMap);
}

private String getColumnId(String fullId) {
    String[] idParts = fullId.split(":");
    return idParts[idParts.length - 1];
}

@PostConstruct
public void init() {
    FacesContext context = FacesContext.getCurrentInstance();
    DataTable table = (DataTable) context.getViewRoot().findComponent(":form:tableid");
    List<UIColumn> columns = table.getColumns();
    for (int i = 0; i < columns.size(); i++) {
        final String columnId = this.getColumnId(columns.get(i).getClientId());
        colIndexMap.put(i, columnId);
        colVisibilityMap.put(columnId, true);
    });
}

public void onColumnReorder(AjaxBehaviorEvent e) {
    List<UIColumn> columns = ((DataTable) e.getSource()).getColumns();
    for (int i = 0; i < columns.size(); i++) {
        this.colIndexMap.put(i, this.getColumnId(columns.get(i).getClientId()));
    }
}

public void onToggle(ToggleEvent e) {
    // If we use list here, e.getData() may not be the correct index due to column reordering.
    this.colVisibilityMap.put(this.colIndexMap.get((Integer) e.getData()), e.getVisibility() == Visibility.VISIBLE);
}
公共映射getColVisibilityMap(){ 返回集合。不可修改映射(colVisibilityMap); } 私有字符串getColumnId(字符串fullId){ 字符串[]idParts=fullId.split(“:”); 返回idParts[idParts.length-1]; } @施工后 公共void init(){ FacesContext context=FacesContext.getCurrentInstance(); DataTable=(DataTable)context.getViewRoot().findComponent(“:form:tableid”); 列表列=table.getColumns(); 对于(int i=0;i 以下是我的JSF页面上的代码:

<p:dataTable id="tableid" widgetVar="tableWidgetVar" draggableColumns="true" paginator="true"
<!-- ommitted other attributes -->
>
    <p:ajax event="colReorder" listener="#{bean.onColumnReorder}"/>
    <f:facet name="header">
        <p:commandButton id="toggler" type="button" value="Columns"/>
        <p:columnToggler datasource="tableid" trigger="toggler">
            <p:ajax event="toggle" listener="#{bean.onToggle}"/>
        </p:columnToggler>
    </f:facet>
    <p:column id="col1" visible="#{bean.colVisibilityMap['col1']}">
        <!-- ommitted -->
    </p:column>
    <p:column id="col2" visible="#{bean.colVisibilityMap['col2']}">
        <!-- ommitted -->
    </p:column>
    <!-- and so on... -->
</p:dataTable>