现在,我正在开发一个使用 DJ NativeSwing 作为我的嵌入浏览器的 java swing 应用程序来做一些自动工作。我的应用程序的场景是用户单击开始按钮,嵌入浏览器自动单击当前页面的某个位置,然后重定向到另一个位置,然后执行其他一些操作,例如单击或其他操作。现在这是我的解决方案。首先我会定义一个webbrowser类(extends JWebBrowser)和webbrowser listener类(implements WebBrowserListener),代表一个webbrowser,分别包含loadingProgressChanged、windowOpening等。二、我定义了一个线程类做一些逻辑计算并通过webbrowser.executeJavascript执行我上面提到的浏览器操作。最后,我为启动和停止按钮添加了 mouseListener 来启动或停止任务。当我打开我的应用程序时,JFrame 添加浏览器及其侦听器类。我单击开始按钮,浏览器正常工作并将按预期单击目标位置,然后页面将重定向到另一个。众所周知,js代码在页面完全加载之前是无法执行的。因此,我在 webbrowser 侦听器类中的loadingProgressChanged(代码:if(e.getWebBrowser().getLoadingProgress() == 100)globalflag = true; )中设置了一个全局标志来检查页面是否已完全加载。在线程类中,我使用代码(while(globalflag == false){Thread.sleep(500);} ) 在第一次点击后检测当前页面是否加载完毕。但是,当浏览器第一次点击目标位置并且页面重定向成功时,我发现当前页面已经改变但是被阻塞了。经过一番调试,我找到了。在我的线程类中,浏览器会通过webbrowser.executeJavascript("document.getElementById('target').click();")执行js代码来点击目标位置然后java代码( while(globalflag == false){Thread .sleep(500);} ) 来检测当前页面是否已完全加载,然后执行一些其他 java 代码。我发现 globalflag 永远不会改变,并且当前页面的 loadingProgressChanged 监听器永远不会工作,因为 java 代码(而(全局标志 == 假))。因为在我删除了第一个webbrowser.executeJavascript("document.getElementById('target').click();")之后的所有 java 代码之后,当前页面的loadingProgressChanged监听器工作并且页面没有被阻止。通过 DJ NativeSwing 演示,我可以在loadingProgressChanged中执行我的 js 。但是,我想用我的浏览器做一系列的操作,也想在需要的时候停止任务。所以,我更喜欢我的解决方案来满足我的需求,而不是演示提供的解决方案。所以,我想知道在webbrowser.executeJavascript之后DJ NativeSwing 线程会等待我的线程吗?而且,在我的软件架构中,有没有人可以提出任何建议?非常感谢。任何建议表示赞赏!PS.my 应用程序在 jdic-0.9.5 上运行良好,但它仅支持 IE7。
我在这里粘贴我的代码来演示我的问题:单击 JFrame 中的开始按钮后,我将新建一个线程,如下所示
public class MyVisit implements Runnable{
private void doClick1(){
webbrowser.executeJavascript("document.getElementById('n').value='test'");
webbrowser.executeJavascript("document.getElementById('f').submit()");
}
public void run() {
globalFlag=false;
webbrowser.executeJavascript("document.getElementById(‘t’).click();") ;
while(!globalFlag){
Thread.sleep(500);
}
this.doClick1();
}
}
listener:
public class MyListener implements WebBrowserListener {
…
public void loadingProgressChanged(WebBrowserEvent e) {
if (e.getWebBrowser().getLoadingProgress() == 100) {
globalFlag=true;
}
}
}