Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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
Java GWT数据网格标头,可筛选和可排序_Java_Gwt_Datagrid - Fatal编程技术网

Java GWT数据网格标头,可筛选和可排序

Java GWT数据网格标头,可筛选和可排序,java,gwt,datagrid,Java,Gwt,Datagrid,我正在尝试为我自己的项目扩展GWT的DataGrid功能,并希望将该功能添加到filer列中。我已经成功地在标题中呈现了一个筛选器框,但它没有响应事件 以下是我的代码的相关部分,已根据此处给出的代码进行了改编: 上面的问题不太适合我的需要,因为如果列是可排序的,它就不起作用 相反,我开发了一个由两个表行(TR)组成的标题,第一行包含过滤器框,第二行包含列标题并响应排序事件。排序事件工作正常,但筛选框不响应任何事件。代码如下: class HeaderBuilder extends Abstrac

我正在尝试为我自己的项目扩展GWT的DataGrid功能,并希望将该功能添加到filer列中。我已经成功地在标题中呈现了一个筛选器框,但它没有响应事件

以下是我的代码的相关部分,已根据此处给出的代码进行了改编:

上面的问题不太适合我的需要,因为如果列是可排序的,它就不起作用

相反,我开发了一个由两个表行(TR)组成的标题,第一行包含过滤器框,第二行包含列标题并响应排序事件。排序事件工作正常,但筛选框不响应任何事件。代码如下:

class HeaderBuilder extends AbstractHeaderOrFooterBuilder<Record> {

    //HTML to render an Input Box
    private InputBoxHTML inputBox = GWT.create(InputBoxHTML.class);

    //List of columns in the table
    private List<ListGridColumn<?>> columns = new ArrayList<ListGridColumn<?>>();

    //Constructor. ListGrid is the outer class extending DataGrid
    private HeaderBuilder() {
        super(ListGrid.this, false); 
    }

    @Override
    protected boolean buildHeaderOrFooterImpl() {

        TableRowBuilder tr = startRow();
        tr.startTH().endTH(); //extra column

        //Create top row of column headers - filter boxes for filterable columns, empty cells for non-filerable
        for (ListGridColumn<?> column : this.columns) {
            TableCellBuilder th = tr.startTH();
            Header<String> header;

            //If this column is filterable...
            if (column.filter) {

                //Create a new Cell containing an Input Box
                AbstractCell<String> cell = new AbstractCell<String>("click","keydown","keyup") {
                    public void render(Context context, String value, SafeHtmlBuilder sb) {
                        sb.append(inputBox.input(""));
                    }
                    public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
                        //These events never fire!
                        Window.alert("event");
                    }
                };
                header = new Header<String>(cell) {
                    public String getValue() {
                        return "value";
                    }
                };

            } else {
                //Empty cell for non-filterable columns 
                header = new TextHeader("");
            }
            Context context = new Context(0, 0, header.getKey());
            renderHeader(th, context, header);
            th.endTH();
        }
        tr.endTR();

        //Bottom row : header captions & sorting. This all works OK
        tr = startRow();
        tr.startTH().endTH(); //extra column
        for (ListGridColumn<?> column : this.columns) {
            TableCellBuilder th = tr.startTH();
            enableColumnHandlers(th, column);
            Header<String> header = new TextHeader(column.headerStr);
            Context context = new Context(0, 0, header.getKey());
            if (column.sortKey!=null) {
                this.renderSortableHeader(th, context, header, true, true);
            } else {
                this.renderHeader(th, context, header);
            }
            th.endTH();
        }
        tr.endTR();

        return true;
    }

}
类HeaderBuilder扩展了AbstractHeaderOrFooterBuilder{
//HTML来呈现输入框
私有InputBoxHTML inputBox=GWT.create(InputBoxHTML.class);
//表中的列列表
私有列表>();
//ListGrid是扩展DataGrid的外部类
私人海德堡(){
super(ListGrid.this,false);
}
@凌驾
受保护的布尔型buildHeaderOrFooterImpl(){
TableRowBuilder tr=startRow();
tr.startTH().endTH();//额外列
//创建列标题的顶行-可筛选列的筛选框,不可筛选列的空单元格
for(ListGridColumn列:this.columns){
TableCellBuilder th=tr.startTH();
收割台;
//如果此列可筛选。。。
if(column.filter){
//创建包含输入框的新单元格
AbstractCell=新的AbstractCell(“单击”、“向下键”、“向上键”){
公共void呈现(上下文上下文、字符串值、安全HtmlBuilder sb){
sb.追加(inputBox.input(“”);
}
public void onBrowserEvent(上下文上下文、元素父级、字符串值、NativeEvent事件、ValueUpdater ValueUpdater){
//这些事件永远不会发生!
窗口警报(“事件”);
}
};
页眉=新页眉(单元格){
公共字符串getValue(){
返回“值”;
}
};
}否则{
//不可过滤列的空单元格
页眉=新文本页眉(“”);
}
Context Context=新上下文(0,0,header.getKey());
renderHeader(th,context,header);
th.endTH();
}
tr.endTR();
//最下面一行:标题和排序。这一切正常
tr=startRow();
tr.startTH().endTH();//额外列
for(ListGridColumn列:this.columns){
TableCellBuilder th=tr.startTH();
enableColumnHandler(th,column);
页眉页眉=新的文本页眉(column.headerStr);
Context Context=新上下文(0,0,header.getKey());
if(column.sortKey!=null){
this.renderSortableHeader(th,context,header,true,true);
}否则{
this.renderHeader(th,context,header);
}
th.endTH();
}
tr.endTR();
返回true;
}
}

如果查看类中方法(由DataGrid和CellTable扩展)的源代码,插入(或添加)列时,页眉(单元格或页脚)的所有事件都将下沉,以便将其从表传播到相应的单元格:

if (header != null) {
  Set<String> headerEvents = header.getCell().getConsumedEvents();
  if (headerEvents != null) {
    consumedEvents.addAll(headerEvents);
  }
}
...
CellBasedWidgetImpl.get().sinkEvents(this, consumedEvents);
if(标题!=null){
Set headerEvents=header.getCell().getConsumedEvents();
if(headerEvents!=null){
consumedEvents.addAll(headerEvents);
}
}
...
CellBasedWidgetImpl.get().sinkEvents(此为consumedEvents);
您在构建器中声明了头,但没有“注册”它,因此事件不会传播到头单元。你应该想办法注册它。我没有看到任何干净的解决方案,因为DataGrid不容易扩展

我可以告诉你们两个肮脏的人:

  • 创建您的DataGrid版本(您需要复制并粘贴代码,并将其声明在DataGrid的同一个包中)并修改它,以便为列注册两个标题

  • 创建一个能够将事件传播到列中两个标头的正确实例的新标头


  • 我将选择2,创建一个包含两个单元格的标题,您可以在生成器中使用这两个单元格。

    谢谢您的回答。您指出了
    insertColumn
    的实现,以及它如何接收头事件,为我提供了解决此问题的线索。最后,它比您建议的要简单-因为我正在实现自己的
    AbstractHeaderOrFooterBuilder
    ,所以我需要做的就是从
    addColumn()
    中删除标题字符串,然后标题将为null,因此事件不再下沉!一笔赏金马上就来!