繁体   English   中英

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

[英]SWT Browser Widget: How to listen to JavaScript events?

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

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

        }

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

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

您可以通过创建BrowserFunction创建可以从浏览器调用的Java函数:

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM