如何从我自己的线程中单独驱动DJ NativeSwing线程

时间:2015-02-11 04:19:06

标签: multithreading djnativeswing jdic

如今,我正在开发一个使用DJ NativeSwing作为我的嵌入式浏览器的java swing应用程序来做一些自动工作。我的应用程序的场景是用户单击开始按钮,嵌入浏览器自动单击当前页面的某个位置,然后重定向到另一个位置,然后执行其他一些操作,如点击或其他。现在这是我的解决方案。首先,我将定义一个 webbrowser类扩展JWebBrowser )和 webbrowser listener类实现WebBrowserListener ),代表一个webbrowser并分别包含 loadingProgressChanged,windowOpening 等。其次,我定义了一个线程类来做一些逻辑计算,并通过 webbrowser.executeJavascript 执行我上面提到的浏览器操作。最后,我添加了用于启动和停止按钮的mouseListener来启动或停止任务。当我打开我的应用程序时,JFrame添加浏览器及其监听器类。我单击开始按钮,浏览器工作,将按预期单击目标位置,然后页面将重定向到另一个。众所周知,在页面完全加载之前,js代码无法执行。所以我设置了一个全局标志来检查页面是否已经完全加载 loadingProgressChanged (代码: if(e.getWebBrowser()。getLoadingProgress()== 100)globalflag webbrowser侦听器类中的= true; )。在线程类中,我首先单击以检测当前页面是否使用代码( while(globalflag == false){Thread.sleep(500);} )完全加载。但是,当浏览器首次单击目标位置并且页面重定向成功时,我发现当前页面已更改但已阻止。经过一些调试,我找到了。在我的线程类中,浏览器将通过 webbrowser.executeJavascript(" document.getElementById('target')执行js代码。单击();") 单击目标位置,然后单击java代码( while(globalflag == false){Thread.sleep(500);} )以检测当前页面是否已完全加载,然后执行其他一些java码。我发现globalflag永远不会改变,当前页面的loadingProgressChanged监听器永远不会工作,因为java代码( while(globalflag == false) )。因为我删除了第一个 webbrowser.executeJavascript(" document.getElementById('target')之后的所有java代码。click();"),当前页面的 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;	
                }
	}
}




1 个答案:

答案 0 :(得分:1)

DJ Native Swing强制使用Swing方法进行线程化:操作AWT事件调度线程(a.k.a. UI线程)中的组件。但是,也不要阻止该线程,因为侦听器也是在该线程中触发的。 所以,你不应该在UI线程中有一个“while”循环,而应该生成一个新线程。我希望你的全局变量是易失性的,或者AtomicBoolean或者它的所有访问都受synchronized块的保护,否则你可能会有一些有趣的线程副作用。