SWT 浏览器小工具:如何监听 JavaScript 事件?

SWT Browser Widget: How to listen to JavaScript events?

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

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

我希望你能帮助我 out/inspire 我可能的解决方案!

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

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

        }

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

您可以修改网页以通过 java 脚本调用 java 函数。

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

  1. 在构造函数中传递 java脚本必须调用的函数名称
  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;
        }
    }

}