提问者:小点点

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


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

你将如何解决这个问题?我已经尝试在浏览器上添加MouseListener()。但是鼠标事件没有多大帮助,因为它们没有携带任何关于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个答案

匿名用户

您可以通过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代码。当按下按钮时,函数被调用并在控制台上打印:

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

}