SWT 浏览器小工具:如何监听 JavaScript 事件?
SWT Browser Widget: How to listen to JavaScript events?
所以我们目前正在开发一个集成了 SWT 浏览器的 RCP 应用程序。我们想在浏览器和 RCP 应用程序之间实现某种通信。主要是我们希望,如果用户在 Web 界面中按下一个按钮,就会触发一个事件,这样 RCP 应用程序就可以侦听它并相应地处理它(一个例子是在 RCP 应用程序中打开一个特定的视图)。
你会如何解决这个问题?我已经尝试在浏览器上添加 MouseListener()。但是鼠标事件并没有多大帮助,因为它们不携带任何关于 web 界面中哪个元素被按下的信息...
我希望你能帮助我 out/inspire 我可能的解决方案!
编辑:
以下是有关如何实例化浏览器的一些示例:
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;
}
}
我很清楚这里还有其他可能的解决方案。这只是我天真的做法
您可以修改网页以通过 java 脚本调用 java 函数。
您可以创建一个 java 函数,该函数可以通过创建 BrowserFunction
从浏览器调用:
- 在构造函数中传递 java脚本必须调用的函数名称
- 发生这种情况时,将执行
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;
}
}
}
所以我们目前正在开发一个集成了 SWT 浏览器的 RCP 应用程序。我们想在浏览器和 RCP 应用程序之间实现某种通信。主要是我们希望,如果用户在 Web 界面中按下一个按钮,就会触发一个事件,这样 RCP 应用程序就可以侦听它并相应地处理它(一个例子是在 RCP 应用程序中打开一个特定的视图)。
你会如何解决这个问题?我已经尝试在浏览器上添加 MouseListener()。但是鼠标事件并没有多大帮助,因为它们不携带任何关于 web 界面中哪个元素被按下的信息...
我希望你能帮助我 out/inspire 我可能的解决方案!
编辑: 以下是有关如何实例化浏览器的一些示例:
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;
}
}
我很清楚这里还有其他可能的解决方案。这只是我天真的做法
您可以修改网页以通过 java 脚本调用 java 函数。
您可以创建一个 java 函数,该函数可以通过创建 BrowserFunction
从浏览器调用:
- 在构造函数中传递 java脚本必须调用的函数名称
- 发生这种情况时,将执行
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;
}
}
}