Vaadin - 禁用特定列的列重新排序

时间:2013-04-25 13:54:37

标签: vaadin multiple-columns

我正在Vaadin 7做一个项目。

在我的项目中,我需要为Treetable中的特定列禁用列重新排序功能吗?

我真的在寻找像'setColumnReorderIds()'这样的函数。

是否可以在Vaadin 7中完成。

否则我需要用'ColumnReorderListener()'编写一些代码?

更新

此代码用于设置TreeTable中固定的第一列。我想在树表中的Hierarchy列中禁用重新排序。

public class CustomTreeTable extends TreeTable {

private static final long serialVersionUID = 1L;
private Object[] visibleColumns;
private KeyMapper<Object> columnIdMap = new KeyMapper<Object>();

@Override
public void paintContent(PaintTarget target) throws PaintException {
    super.paintContent(target);
    paintColumnOrder(target);
}

private void paintColumnOrder(PaintTarget target) throws PaintException {
    visibleColumns = this.getVisibleColumns();
    final String[] colorder = new String[visibleColumns.length];
    int i = 0;
    colorder[i++] = columnIdMap.key("Column 1"); // Logic to keep the first column fixed
    for (Object colId : visibleColumns) {
        if(!colId.equals("Column 1")) {
            colorder[i++] = columnIdMap.key(colId);
        }
    }
    target.addVariable(this, "columnorder", colorder);
}
}

更新2

我尝试过奥斯卡说的话。

除了

paintColumnOrder(target). 

我正在打电话

paintVisibleColumnOrder(target), 
paintAvailableColumns(target), 
paintVisibleColumns(target). 

我只能停止对表头进行重新排序。但是,身体仍在重新排序。有关这个问题的任何猜测吗?

1 个答案:

答案 0 :(得分:1)

在文档中,只有setColumnReorderingAllowed()允许控制所有列的重新排序。因此,如果你的情况是控制特定的,它看起来像一个非常自定义的行为,我会采用自己的实现。另外{<1}}在处理动作本身后生成,因此实现自己的ColumnReorderEvent无法帮助我们。

我们想要更改的所有实际魔法都发生在ColumnReorederListener来自private Table.paintColumnOrder()的{​​{1}},来自public Table.paintContent()(请参阅TableTreeTable的来源)。解决方案是:

  1. 延长public TreeTable.paintContent()
  2. 使用TreeTablepaintContent()
  3. 的合并副本覆盖Table.paintContent()
  4. 用您的自定义逻辑替换TreeTable.paintContent()来电。
  5. <强>更新

    好的,现在我觉得它比我在beginnig上想的更棘手,因为在子类化TreeTable之后没有简单的方法来访问大多数必需的字段和方法...此外,在客户端上重新列出了列并且仅发送更改事件状态以通知服务器。我不知道如何在不创建自定义gwt小部件的情况下处理自定义重新排序:(