如何向 GWT CellTable 中的 ButtonCells 添加工具提示?

How to add tooltips to ButtonCells in a GWT CellTable?

我在 GWT 中有一个 CellTable,其中最后一列是 ButtonCell。我想根据所用对象的属性向按钮添加工具提示。问题是每个对象都有不同的属性值,但 GWT 为所有按钮显示相同的工具提示文本(取自 table 的最后一行)。有什么建议吗?

final ButtonCellDefinitionExtended<MyObject> def = new ButtonCellDefinitionExtended<MyObject>() {
            @Override
            public boolean isVisible(MyObject bean) {
                return bean.getAttribute1() != null;
            }
            @Override
            public String getTooltip(MyObject bean) {
                return bean.getAttribute2(); //doesn't work
            }
        };

class:

public class ButtonCellDefinitionExtended<T> extends CellColumnDefinition<T, String> {
    private String tooltipText;
    private TooltipCellDecorator<String> cellDecorator;
    private ButtonCell buttonCell;

    public ButtonCellDefinitionExtended() {
        buttonCell = new ButtonCell();
        cellDecorator = new TooltipCellDecorator<>(buttonCell);
    }

    @Override
    protected Cell<String> getCell() {
        return cellDecorator;
    }

    @Override
    protected String getValueOf(T bean) {
        //Button
        buttonCell.setEnabled(isEnabled(bean));
        buttonCell.setVisible(isVisible(bean));
        //Tooltip
        if (getTooltip(bean) != null) {
            cellDecorator.setText(getTooltip(bean));
        }
        cellDecorator.setPlacement(Placement.LEFT);
        return getButtonText(bean);
    }

P.S:每个按钮的可见性都已正确设置。

您可以使用 AbstractCell and it's render() 方法获取(几乎)任何您喜欢的单元格。

请注意,AbstractCell 的构造函数采用 consumedEvents 参数,您可以在 onBrowserEvent() 方法中处理这些事件。

请注意,consumedEvents 是针对整个单元格触发的,而不仅仅是针对呈现的按钮。

隐藏按钮的最简单方法是不呈现任何内容 ;)

带工具提示的按钮的工作示例代码:

AbstractCell<String> cell = new AbstractCell<String>(ClickEvent.getType().getName()) {
    @Override
    public void render(Context context, String value, SafeHtmlBuilder sb) {
        Button button = new Button("Button " + value);
        button.setTitle(value);
        sb.append(SafeHtmlUtils.fromTrustedString(button.toString()));
    }

    @Override
    public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
        if(event.getType() == ClickEvent.getType().getName())
            Window.alert("Clicked: " + value);
    }
};

table.addColumn(new Column<String, String>(cell) {
    @Override
    public String getValue(String object) {
        return object;
    }
}, "Buttons");

table.setRowData(Arrays.asList("A", "B", "C"));
RootPanel.get().add(table);

结果:包含带有工具提示的按钮的列: