Как водить нить DJ NativeSwing отдельно от моей собственной темы

В настоящее время я работаю над Java-свинг-приложением, использующим DJ NativeSwing в качестве браузера для встраивания, чтобы сделать что-то автоматическое. Сценарий моего приложения заключается в том, что пользователь нажимает кнопку "Пуск", а браузер встраивания автоматически выбирает какую-либо позицию текущей страницы, затем перенаправляет на другую страницу и затем выполняет некоторые другие операции, такие как нажатие или что-то другое. Теперь вот мое решение. Сначала я определю класс webbrowser (расширяет JWebBrowser) и класс слушателя webbrowser (реализует WebBrowserListener), который представляет веб- браузер и содержит loadingProgressChanged, windowOpening и т. Д. По отдельности. Во-вторых, я определяю класс потока для выполнения некоторых логических вычислений и выполнения операций моего браузера, как упомянуто выше в webbrowser.executeJavascript. Наконец, я добавляю mouseListener для кнопки запуска и остановки, чтобы запустить или остановить задачу. Когда я открываю свое приложение, JFrame добавляет браузер и его класс слушателя. Я нажимаю кнопку "Пуск", браузер работает и нажимает на целевую позицию, как я ожидал, а затем страница перенаправляется на другую. Как мы все знаем, js-код не может быть выполнен до полной загрузки страницы. Поэтому я установил глобальный флаг, чтобы проверить, полностью ли загружена страница в loadingProgressChanged (code: if (e.getWebBrowser (). GetLoadingProgress () == 100) globalflag = true;) в классе слушателя webbrowser. А в классе потока я использую код (while (globalflag == false) {Thread.sleep (500);}) после первого щелчка, чтобы определить, полностью ли загружена текущая страница. Однако, когда браузер впервые щелкает по целевой позиции и страница перенаправляется успешно, я обнаруживаю, что текущая страница изменилась, но заблокирована. После некоторой отладки я нахожу это. В моем классе потока браузер выполнит js-код с помощью webbrowser.executeJavascript("document.getElementById('target'). Click();"), чтобы щелкнуть по целевой позиции, а затем по коду Java (while (globalflag == false) {Thread.sleep (500);}), чтобы определить, полностью ли загружена текущая страница, а затем выполнить другой код Java. Я обнаружил, что globalflag никогда не изменится, и прослушиватель loadingProgressChanged текущей страницы никогда не будет работать из-за кода java (while (globalflag == false)). Потому что после того, как я удаляю весь код Java после первого webbrowser.executeJavascript("document.getElementById('target'). Click ();"), прослушиватель loadingProgressChanged текущей страницы работает, и страница не была заблокирована. С помощью демонстрации DJ NativeSwing я мог выполнять свои js в loadingProgressChanged. Тем не менее, я хочу выполнить серию операций с моим браузером, а также остановить работу при необходимости. Таким образом, я предпочитаю свое решение по моему требованию, а не предоставленное демо. Итак, мне интересно, что после 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 ответ

Решение

DJ Native Swing применяет подход Swing к созданию потоков: манипулировать компонентами в потоке диспетчера событий AWT (он же поток пользовательского интерфейса). Но также не блокируйте этот поток, потому что слушатели также запускаются в этом потоке. Таким образом, у вас не должно быть цикла while в потоке пользовательского интерфейса, но вместо этого следует создавать новый поток. Я надеюсь, что ваша глобальная переменная является volatile, или AtomicBoolean, или все обращения к ней защищены синхронизированным блоком, в противном случае у вас могут возникнуть интересные побочные эффекты.

Другие вопросы по тегам