Добавить SuggestBox в CellTable как редактируемую ячейку - PullRequest
4 голосов
/ 01 октября 2011

Есть ли способ до SuggestBox до CellTable?Может быть, есть другое решение тогда SuggestBox?

Мне нужно получить редактируемую ячейку с функцией предложения?

Я использую GWT 2.4.

Ответы [ 4 ]

2 голосов
/ 01 октября 2011

Не думаю, что вы можете добавить его напрямую. Попробуйте использовать ClickableTextCell в качестве ячейки для этого столбца.Затем закодируйте ваш ValueUpdater (который будет вызываться при нажатии на ячейку), чтобы открыть DialogBox.Поместите свой SuggestBox и другие виджеты (кнопка «ОК», «Отмена» и т. Д.) Внутри этого DialogBox.Инициализируйте SelectionBox с текущим содержимым ячейки.Скорее всего, DialogBox будет подклассом DialogBox с дополнительными данными состояния, которые вы инициализируете с помощью объекта для этой строки CellTable, а также с полем для этого столбца, так что действие OK знает, какое поле в каком объекте обновить с новым содержимым SuggestBox,По сути это всплывающий редактор.Не идеально, потому что пользователи ожидают, что редактор будет встроен в CellTable, но доступно только несколько редакторов ячеек (EditTextCell, DatePickerCell, SelectionCell и CheckboxCell и, возможно, другой вариант редактирования текста), но я использовал эту техникуи действительно, это не так уж плохо.

1 голос
/ 13 декабря 2012

Мне это тоже нужно было, и я нашел решение (в процессе тестирования, но solong работает):

Я скопировал код из TextInputCell в новый класс SuggestBoxTextInputCell

public class SuggestBoxTextInputCell extends AbstractInputCell<String, SuggestBoxTextInputCell.ViewData> {

    MySuggestBox suggestBox;

и добавилнесколько строк в методе onBrowserEvent:

    // Ignore events that don't target the input.
    InputElement input = getInputElement(parent);
    String eventType = event.getType();
    if (BrowserEvents.FOCUS.equals(eventType)) {
        TextBox textBox = new MyTextBox(input);
        suggestBox = new MySuggestBox(getSuggestOracle(), textBox);
        suggestBox.onAttach();
    } 

    Element target = event.getEventTarget().cast();

Классы MySuggestBox и MyTextbox существуют только для того, чтобы сделать необходимые конструктор и методы общедоступными:

private class MyTextBox extends TextBox {
    public MyTextBox(Element element) {
        super(element);
    }
}

private class MySuggestBox extends SuggestBox {

    public MySuggestBox(SuggestOracle suggestOracle, TextBox textBox) {
        super(suggestOracle, textBox);
    }

    @Override
    public void onAttach() {
        super.onAttach();
    }

}

getSuggestOracle () предоставляет только необходимый SuggestOracle.Надеюсь, кто-то может использовать это решение.

1 голос
/ 03 ноября 2011

Я закончил, используя FlexTable вместо CellTableFlexTable вы можете поместить любой виджет в ячейку таблицы.

0 голосов
/ 14 сентября 2017

Мне нужно было это решение, поэтому я поиграюсь с решением, предоставленным Анде Хофером.

Точно такая же проблема встречалась с Анкит Синглой, когда коробка подсказок работает нормально, когда я нажимаю клавишу «Ввод», но не из «Щелчка мыши».

Я иду дальше и добавляю это к решению.

if (BrowserEvents.FOCUS.equals(eventType)) {
        ...
        ...

        suggestbox.addSelectionHandler(new SelectionHandler<Suggestion>() {

            @Override
            public void onSelection(SelectionEvent<Suggestion> event) {
                Suggestion selectedSuggestion = event.getSelectedItem();
                String selectedValue = selectedSuggestion.getReplacementString();

                onSuggestSelected(input, selectedValue, valueUpdater);
            }

        });

        suggestbox.onAttach();
    }

и приватная функция

    private void onSuggestSelected(Element input, String value,
          ValueUpdater<String> valueUpdater) {
        input.blur();
        suggestbox.onDetach();
        if (suggestbox.getSuggestionDisplay().isSuggestionListShowing()) {
            ((DefaultSuggestionDisplay) suggestbox.getSuggestionDisplay()).hideSuggestions();
        }

        valueUpdater.update(value);
    }

Пока все хорошо.

...