Добавление clickHandler в строку в CellTable в GWT?

Я создал базовый CellTable и заполнил его некоторыми данными. Теперь я хочу добавить clickHandler в каждую строку, но я не уверен, как это сделать. Я создал clickEvent для всей таблицы, но я хочу по одному для каждой строки.

    table.sinkEvents(Event.ONCLICK);
    table.setTitle("Click me");
    table.setSize("600px", "600px");
    table.addDomHandler(new ClickHandler()
    {
        @Override
        public void onClick(ClickEvent event)
        {
            Window.alert("You clicked!" +);

        }
    }, ClickEvent.getType());

Можно ли сделать что-то подобное, чтобы добавить clickEvent для каждой строки?

Ответ 1

В CellTable встроена поддержка обработки событий click. Вы можете добавить CellPreviewHandler, который будет вызываться среди других при щелчке по строке. Он получит несколько элементов в событии, таких как значение основного события, ячейки и строки данных. Поскольку он срабатывает не только для событий кликов, вам нужно проверить, был ли запущен клик. Просто протестируйте пройденное событие: boolean isClick = "click".equals(event.getNativeEvent().getType()).

Другой вариант заключается в расширении защищенного метода doSelection, но он устарел и вам нужно, чтобы у вас есть правильный KeyboardSelectionPolicy, чтобы убедиться, что он вызван, когда клик сделан. См. Последний в JavaDoc интерфейса KeyboardSelectionPolicy.

Ответ 2

Другой способ выбора ячейки можно сделать с помощью NoSelectionModel и добавить его в таблицу:

//EDIT: this is a field, not a local variable
TheCellObject clickedObject; //the object selected by selectionModel

final NoSelectionModel<TheCellObject> selectionModel = new NoSelectionModel<TheCellObject>();

    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {

                @Override
                public void onSelectionChange(SelectionChangeEvent event) {
                    clickedObject = selectionModel.getLastSelectedObject();
                }
            });
cellTable.setSelectionModel(selectionModel); //add selection model to your celltable