首页 > 解决方案 > SWT 浏览器小部件:如何监听 JavaScript 事件?

问题描述

所以我们目前正在开发一个集成了 SWT 浏览器的 RCP 应用程序。我们希望在浏览器和 RCP 应用程序之间实现某种通信。主要是我们希望,如果用户在 Web 界面中按下一个按钮,就会触发一个事件,因此 RCP 应用程序可以监听它并相应地处理它(一个例子是在 RCP 应用程序中打开一个特定的视图)。

你将如何解决这个问题?我已经尝试在浏览器上添加鼠标监听器()。但是鼠标事件并没有太大帮助,因为它们不携带任何关于 web 界面内的哪个元素被按下的信息......

我希望你能通过可能的解决方案帮助我/启发我!

编辑:以下是一些有关如何实例化浏览器的示例:

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;
            }

        }

我很清楚这里还有其他可能的解决方案。这只是我幼稚的做法

标签: javascriptjavahtmlswtrcp

解决方案


您可以修改您的网页以通过 javascript 调用 java 函数。

您可以通过创建一个可以从浏览器调用的 java 函数BrowserFunction

  1. 在构造函数中传递 javascript 必须调用的函数名
  2. 发生这种情况时,BrowserFunction.function将执行该方法

简单的例子:

带有在按下时调用 java 函数的按钮的网页(page.html):

<!DOCTYPE html>
<html>
<body>

<button type="button" onclick="javaFunction()">Click Me!</button>

</body>
</html> 

显示如何从 SWT 浏览器显示网页的 java 代码。当按下按钮时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;
        }
    }

}

推荐阅读