SWT Browser Widget: Как слушать события JavaScript? - PullRequest
0 голосов
/ 30 ноября 2018

, поэтому в настоящее время мы работаем над приложением 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 Ответ

0 голосов
/ 01 декабря 2018

Вы можете изменить свою веб-страницу для вызова java-функции через javascript.

Вы можете создать java-функцию, которую можно вызывать из браузера, создав BrowserFunction:

  1. в конструкторе вы передаете имя функции, которую javascript должен будет вызвать
  2. , когда это произойдет, будет выполнен метод BrowserFunction.function

Simpleпример:

Веб-страница с кнопкой, которая при нажатии вызывает функцию 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;
        }
    }

}
...