現在、私は DJ NativeSwing を埋め込みブラウザーとして使用して、自動作業を行うための Java Swing アプリケーションに取り組んでいます。私のアプリケーションのシナリオは、ユーザーがスタートボタンをクリックし、埋め込みブラウザが現在のページのある位置を自動クリックしてから、別のページにリダイレクトしてから、クリックなどの他の操作を実行することです。ここに私の解決策があります。まず、webbrowser クラス( extends JWebBrowser ) とwebbrowser リスナー クラス( 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 コードを実行します。java コード (while(globalflag == false) )。最初の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;
}
}
}