javascript - SWT 浏览器小部件:如何监听 JavaScript 事件?
问题描述
所以我们目前正在开发一个集成了 SWT 浏览器的 RCP 应用程序。我们希望在浏览器和 RCP 应用程序之间实现某种通信。主要是我们希望,如果用户在 Web 界面中按下一个按钮,就会触发一个事件,因此 RCP 应用程序可以监听它并相应地处理它(一个例子是在 RCP 应用程序中打开一个特定的视图)。
你将如何解决这个问题?我已经尝试在浏览器上添加鼠标监听器()。但是鼠标事件并没有太大帮助,因为它们不携带任何关于 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 函数BrowserFunction
:
- 在构造函数中传递 javascript 必须调用的函数名
- 发生这种情况时,
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;
}
}
}
推荐阅读
- amazon-web-services - Amazon EC2 - 监听 HTTPS 请求并重定向到 SpringBoot
- javascript - Visa Electron 正则表达式与字符串不匹配
- node.js - Node.js 使用 Redis 解决并发问题
- arrays - 从 C 中的文件中读取浮点数数组
- html - 如何通过传递对象使用 [ngstyle] 将网格行和网格列动态传递到角度 div 选项卡
- javascript - 在 JS 中显示用户输入的文本
- angular - 在prime ng列表框中添加虚拟滚动
- sql - 插入行时有没有办法避免“此处不允许列”错误
- php - Ckeditor textarea 的值在第一次提交时未发布,但它适用于第二次提交,其他字段(如图像属性等)是不可编辑的
- reactjs - 使用 React 和 Firestore 数据库的无限循环图像 - 如何获取我的数据?