SWT浏览器小部件:如何收听JavaScript事件?

时间:2018-11-30 11:04:30

标签: javascript java html swt rcp

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

您将如何解决这个问题?我已经尝试在浏览器上添加addMouseListener()。但是mouseevents并没有太大帮助,因为它们不携带任何有关按下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;
            }

        }

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

1 个答案:

答案 0 :(得分:1)

您可以修改网页以通过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> 

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

}