#java #gwt #gxt
#java #gwt #gxt
Вопрос:
Обычно событие Change запускается после того, как текстовое поле теряет фокус (при размытии).
Но мне нужно, чтобы оно срабатывало, как только изменяется значение поля, без необходимости терять фокус на поле.
KeyListener не удаляет его, потому что значение может поступать, например, от сканера штрих-кода.
Есть ли какой-либо способ добиться этого?
Заранее спасибо!
Ответ №1:
Я не работал с ext-gwt, но это то, что вам нужно сделать: вы должны использовать KeyListener И добавить прослушиватель для ONPASTE. Событие «Изменение» предоставляется браузером, и оно запускается только при исчезновении фокуса (во время размытия), и если текст изменился.
Комментарии:
1. Спасибо за ваш ответ. К сожалению, после попытки применить ваше решение, кажется, что тип события ‘OnPaste’ в Ext-GWT, который представляет событие DOM ONPASTE, также не работает. 🙁
2. Проверьте, помогает ли это .
3. Поддержка события вставки довольно сильно отличается от браузера к браузеру, подробно: http://www.quirksmode.org/dom/events/cutcopypaste.html (похоже, что это вообще не работает с Opera). Попробуйте это в вашем браузере на тестовой странице . Важным отличием может быть то, на каком элементе каждый браузер запускает событие — и на каком Ext-GWT регистрирует прослушиватель.
Ответ №2:
Я не думаю, что существует событие, которое работает в кроссбраузерном режиме для всех ситуаций. Итак, «решение для бедных» заключается в том, чтобы опрашивать текстовое поле каждую секунду или около того. На самом деле, такой тест может быть выполнен довольно быстро, и если вы не используете его для множества текстовых полей одновременно, все должно быть в порядке.
Вы можете использовать мой небольшой пример кода, если хотите (он работает в обычном текстовом поле GWT, но его должно быть легко адаптировать для текстового поля Ext-GWT)
@Override
public void onModuleLoad() {
final TextBox textBox = new TextBox();
final int delayMilliseconds = 1000;
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
private String previousValue = "";
@Override
public boolean execute() {
final String newValue = textBox.getValue();
if (!previousValue.equals(newValue)) {
try {
valueChanged();
} finally {
previousValue = newValue;
}
}
return true;
}
private void valueChanged() {
// React on the change
Window.alert("Value changed");
}
}, delayMilliseconds);
RootPanel.get().add(textBox);
}