Меня озадачивает следующая проблема: у меня есть приложение SWT Java, и переключение с SWT 3 на SWT 4 приводит к странному поведению события KeyDown при следующих обстоятельствах:
У меня есть одна оболочка, содержащая браузервиджет. Я слушаю события KeyDown на уровне Java через фильтр объекта Display, как показано ниже. Когда такое событие обнаружено, я затем вызываю функцию execute () виджета Browser для выполнения некоторого JavaScript. Я выбрал обнаружение события KeyDown на глобальном уровне Java, а не непосредственно в javascript, потому что браузер может не обязательно фокусироваться в этот момент.
Ожидаемое поведение: событие KeyDown должно обнаруживаться один раз
Фактическое поведение: событие KeyDown обнаруживается три раза
То, что я пробовал и изучил до сих пор: 1) Проблема возникает только при использовании виджета «Браузер». 2) Проблема возникает не только при выполнении некоторого JavaScript, но также и в том случае, если я просто устанавливаю содержимое браузера (br.setText ("...")), поэтому кажется, что любое действие в браузере вызывает проблему. 3) Проблема не возникает с SWT 3.836. Это происходит с SWT 4.924
Возврат к SWT 3 не идеальный вариант, потому что он вызвал много сбоев из-за libwebkitgtk, и я избавился от них с SWT 4 ...
Конфигурация: Ubuntu 18.04, Java openjdk 11 adm64, SWT 4.924 (загружено со страницы загрузки Eclipse последняя стабильная версия 4.14M1)
Вот код:
public static void main(String[] args) {
System.out.println("Launching test application");
Display display = new Display();
Shell shell = new Shell(display);
Browser br = new Browser(shell,SWT.NONE);
br.setSize(500,500);
display.addFilter(SWT.KeyDown, new Listener() {
@Override
public void handleEvent(Event event) {
System.out.println(event.keyCode);
//Try either of the following two lines to reproduce the problem. If you comment both lines, the problem disappears
br.execute("javascript:alert('hello')");
//br.setText("<html><head></head><body>TEST</body></html>");
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
{
display.sleep();
}
}
}
Есть подсказки? Заранее спасибо!