Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWT浏览器小部件:如何监听JavaScript事件?_Javascript_Java_Html_Swt_Rcp - Fatal编程技术网

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

SWT浏览器小部件:如何监听JavaScript事件?,javascript,java,html,swt,rcp,Javascript,Java,Html,Swt,Rcp,因此,我们目前正在开发一个RCP应用程序,它集成了SWT浏览器。我们希望在浏览器和RCP应用程序之间实现某种通信。我们主要希望,如果用户在Webinterface中按下一个按钮,就会触发一个事件,这样RCP应用程序就可以监听并相应地处理它(例如,在RCP应用程序中打开一个特定的视图) 你将如何解决这个问题?我已经尝试在浏览器上添加MouseListener()。但是mouseevents帮不了什么忙,因为它们没有任何关于Web界面中哪个元素被按下的信息 我希望你能帮助我解决问题/用可能的解决方案

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

你将如何解决这个问题?我已经尝试在浏览器上添加MouseListener()。但是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;
            }

        }

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

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

您可以创建一个java函数,该函数可以通过创建:

  • 在构造函数中,传递javascript必须调用的函数名
  • 发生这种情况时,将执行
    BrowserFunction.function
    方法
  • 简单的例子:

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


    你能添加一些你尝试过的代码吗?看看这个,当然,我已经添加了一些额外的例子。如果还有什么不清楚的地方,请告诉我。SWT代码不知道浏览器中发生了什么。您可能需要编写Javascript代码来处理事件,并使用
    BrowserFunction
    API调用Java(参见示例)
    <!DOCTYPE html>
    <html>
    <body>
    
    <button type="button" onclick="javaFunction()">Click Me!</button>
    
    </body>
    </html> 
    
    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;
            }
        }
    
    }