SWT Browser Widget: Как слушать события JavaScript?
Поэтому в настоящее время мы работаем над приложением RCP, в которое встроен браузер SWT. Мы хотели бы реализовать какую-то связь между браузером и приложением RCP. В основном мы хотим, чтобы, если пользователь нажимает кнопку в веб-интерфейсе, запускалось событие, чтобы приложение RCP могло его прослушивать и обрабатывать соответствующим образом (например, было бы открытие определенного представления внутри приложения RCP).
Как бы вы решили эту проблему? Я уже пытался добавить MouseListener() в браузере. Но события мыши мало помогают, поскольку они не несут никакой информации о том, какой элемент внутри веб-интерфейса был нажат...
Я надеюсь, что вы могли бы помочь мне / вдохновить меня с возможными решениями!
РЕДАКТИРОВАТЬ: Вот несколько примеров того, как создается экземпляр браузера:
public class BrowserView extends ViewPart {
Browser browser;
private static final Log LOG = LogFactory.getLog(BrowserView.class);
@Override
public void createPartControl(Composite parent) {
this.browser = new Browser(parent, SWT.NONE);
browser.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
// do something with the event
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
});
}
@Override
public void setFocus() {
// Do nothing
}
public void setUrl(String url) {
this.browser.setUrl(url);
}
}
Поэтому в основном мы создаем браузер в конкретном композите. Мы попытались добавить обработчик к событию mouseDown, но это не очень помогает, поскольку событие не содержит никакой информации о том, какая кнопка была вызвана в браузере. Как мы можем получить расширенную информацию о событиях, касающихся браузера? Допустим, содержимое внутри браузера имеет Button1, Button2 и Button3. Мы хотим что-то вроде
public void mouseDown(MouseEvent e) {
switch (e.getType.getName()) {
case "Button1": handleButton1();
break;
case "Button2": handleButton2();
break;
case "Button3": handleButton3();
break;
}
}
Мне хорошо известно, что здесь есть и другие возможные решения. Это был только мой наивный подход
1 ответ
Вы можете изменить свою веб-страницу для вызова функции Java через JavaScript.
Вы можете создать Java-функцию, которую можно вызывать из браузера, создав BrowserFunction
:
- в конструкторе вы передаете имя функции, которую должен вызвать javascript
- когда это произойдет,
BrowserFunction.function
метод будет выполнен
Простой пример:
Веб-страница с кнопкой, которая при нажатии вызывает функцию Java (page.html):
<!DOCTYPE html>
<html>
<body>
<button type="button" onclick="javaFunction()">Click Me!</button>
</body>
</html>
Java-код, который показывает, как отобразить веб-страницу из браузера SWT. Когда кнопка нажата function
вызывается и печатается на консоли:
public class BrowserTest {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Browser browser = new Browser(shell, SWT.NONE);
browser.setUrl("file:/C:/BrowserTest/page.html");
new JavaFunction(browser, "javaFunction");
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private static class JavaFunction extends BrowserFunction {
JavaFunction(Browser browser, String name) {
super(browser, name);
}
@Override
public Object function(Object[] arguments) {
System.out.println("Button pressed!");
return null;
}
}
}