-1

现在,我正在开发一个使用 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;	
                }
	}
}

4

1 回答 1

1

DJ Native Swing 对线程执行 Swing 方法:在 AWT Event Dispatch 线程(又名 UI 线程)中操作组件。而且,不要阻塞那个线程,因为监听器也在那个线程中被触发。所以,你不应该在 UI 线程中有一个“while”循环,而应该生成一个新线程。我希望您的全局变量是 volatile 或 AtomicBoolean 或对它的所有访问都受同步块保护,否则您可能会有有趣的线程副作用。

于 2015-02-14T13:19:14.003 回答