Ext GWT(GXT)工具提示在网格行上

时间:2011-04-19 13:02:49

标签: gwt gxt

我正在使用Ext GWT(GXT)为我的项目开发一个自定义工具提示,并且当它们被选中时,此工具提示必须显示在Grid行上。 我无法使用默认的GXT工具提示或快速提示,因为我需要能够在此工具提示中添加组件(如按钮)。

问题是GXT Grid组件没有公开与鼠标悬停在一行上的事件(尽管有RowClick和RowMouseDown)。 我尝试使用OnMouseOver和OnMouseOut事件向Grid添加一个侦听器,但它不能按预期工作。它会随时发射这些事件 你将鼠标悬停在组成一行的任何div和spans上。

我看到解决这个问题的唯一方法是继承GridView组件并使每一行成为一个Component本身, 但这将是很多工作,也可能会影响性能。我不禁想到有更好的方法来做到这一点。

对于GXT更有经验的人能给我一个亮点吗?

5 个答案:

答案 0 :(得分:2)

试试这个

QuickTip quickTip = new QuickTip(grid);

grid.addListener(Events.OnMouseOver, new Listener<GridEvent<BeanModel>>(){

            @Override
            public void handleEvent(GridEvent<BeanModel> ge) {
                com.google.gwt.dom.client.Element el=  grid.getView().getCell(ge.getRowIndex(),ge.getColIndex());
                String html = "<span qtip='" + el.getFirstChildElement().getInnerText() + "'>" + el.getFirstChildElement().getInnerText()  + "</span>";     
                el.getFirstChildElement().setInnerHTML(html);

            }
});

答案 1 :(得分:0)

onComponentEvent()(在com.extjs.gxt.ui.client.widget.Component中定义,空体并在com.extjs.gxt.ui.client.widget.grid.Grid中重写)也接收类型为的事件Event.ONMOUSEOVER和Event.ONMOUSEOUT

Grid类中的默认实现不处理这些事件,因此您可能希望在子类中覆盖此函数。

此外,在onComponentEvent()的末尾,Grid调用GridView的函数handleComponentEvent()。

答案 2 :(得分:0)

我找到了两种方法:

1.对于网格描述渲染器的特定列,例如:

{
    width: 200,
    dataIndex : 'invoice',
    renderer:addTooltip
}

你的渲染器功能:

function addTooltip(value, metadata){
    metadata.attr = 'ext:qtip="' + value + '"';
    return value;
}

但是只有当鼠标指针位于特定列的上方时,此方法才有效。

2.对于网格的'render'事件,应用/使用此函数:

var myGrid = grid;

myGrid.on('render', function() {
    myGrid.tip = new Ext.ToolTip({
        view: myGrid.getView(),
        target: myGrid.getView().mainBody,
        delegate: '.x-grid3-row',
        trackMouse: true,
        renderTo: document.body,
        listeners: {
            beforeshow: function updateTipBody(tip) {
                tip.body.dom.innerHTML = "Over row " + tip.view.findRowIndex(tip.triggerElement);
            }
        }
    });
});

我希望这会对你有所帮助:)。

答案 3 :(得分:0)

我知道这已经过时但是没有接受的答案,我认为我找到了更好的方法:

grid.addListener(Events.OnMouseOver, new Listener<GridEvent<Model>>() {
            @Override
            public void handleEvent(GridEvent<Model> ge) {
                if (grid.getToolTip() != null) {
                    grid.getToolTip().hide();
                }
                ModelData model = ge.getModel();
                if (model != null) {
                    Object someValue = model.get("someProperty");
                    String label = someValue.toString();
                    grid.setToolTip(label);
                }
                if (grid.getToolTip() != null) {
                    grid.getToolTip().show();
                }
            }
        });

答案 4 :(得分:0)

我正在使用GWT 2.6和GXT 3.1.0,我设法用这种方式做到了.... 这里的类RowSet类似于Map

        GridView<RowSet> view = new GridView<RowSet>() {
        private Element cell;

        @Override
        protected void handleComponentEvent(Event event) {
            switch (event.getTypeInt()) {
            case Event.ONMOUSEMOVE:
                cell = Element.is(event.getEventTarget()) ? findCell((Element) event.getEventTarget().cast())
                        : null;
                break;
            }
            super.handleComponentEvent(event);
        }

        @Override
        protected void onRowOut(Element row) {
            grid.hideToolTip();
            grid.setToolTipConfig(null);
            super.onRowOut(row);
        }

        @Override
        protected void onRowOver(final Element row) {
            super.onRowOver(row);
            grid.hideToolTip();
            grid.setToolTipConfig(null);

            ToolTipConfig config = new ToolTipConfig();
            int rowIndex = grid.getView().findRowIndex(row);
            // Through "rowIndex" you can get the Row like this : 
            // grid.getStore().get(rowIndex)
            config.setBodyHtml("Your tool tip text here");
            config.setTitleHtml("Tool Tip Title");
            config.setCloseable(true);
            grid.setToolTipConfig(config);

            int absoluteRight = (cell != null) ? cell.getAbsoluteRight() : row.getAbsoluteRight();
            int absoluteTop = (cell != null) ? cell.getAbsoluteTop() : row.getAbsoluteTop();
            Point point = new Point(absoluteRight, absoluteTop);
            grid.getToolTip().showAt(point);
        }
    };
    view.setAutoFill(true);
    grid.setView(view);