#gwt #suggestbox
#gwt #suggestbox
Вопрос:
Есть ли какой-либо способ SuggestBox
CellTable
? Может быть, тогда есть другое решение SuggestBox
?
Мне нужно получить редактируемую ячейку с функцией предложения?
Я использую GWT 2.4.
Ответ №1:
Я не думаю, что вы можете добавить его напрямую. Попробуйте использовать ClickableTextCell в качестве ячейки для этого столбца. Затем закодируйте свой ValueUpdater (который будет вызываться при нажатии на ячейку), чтобы открыть диалоговое окно. Поместите свой SuggestBox и другие виджеты (кнопка OK, кнопка отмены и тому подобное) внутри этого диалогового окна. Инициализируйте поле выбора текущим содержимым ячейки. Диалоговое окно, скорее всего, будет подклассом диалогового окна с дополнительными данными состояния, которые вы инициализируете с помощью объекта для этой строки CellTable, а также поля для этого столбца, чтобы действие OK знало, какое поле для какого объекта обновлять новым содержимым SuggestBox. По сути, это всплывающий редактор. Не идеально, потому что пользователи ожидают, что редактор будет встроен в CellTable, но доступно всего несколько редакторов ячеек (EditTextCell, DatePickerCell, SelectionCell и CheckboxCell, и, возможно, другой вариант редактирования текста), но я использовал эту технику, и действительно, это не так уж плохо.
Ответ №2:
В итоге я использовал FlexTable
вместо CellTable
. С FlexTable
помощью вы можете поместить любой виджет в ячейку таблицы.
Ответ №3:
Мне это тоже было нужно, и я нашел решение (в стадии тестирования, но пока оно работает):
Я скопировал код из 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. Он работает нормально, когда я выбираю через enter. Но когда я выбираю с помощью мыши по щелчку, он не выдает выбранный value..it выдает только то значение, которое я ввел.
Ответ №4:
Мне это было нужно как решение, поэтому я поиграл с решением, предоставленным Ande Hofer.
Точно такая же проблема, с которой столкнулся Анкит Сингла, когда suggestbox работает нормально, когда я нажимаю клавишу «Enter», но не от «Щелчка мыши».
Я продолжаю дальше и добавляю это в решение.
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);
}
Пока все хорошо.