2014-10-05 4 views
0

Это мой первый пост на этом сайте. Надеюсь, я скоро получу помощь и смогу помочь другим.Несколько браузеров с использованием java SWT.MOZILLA и XULRunner

Я пытаюсь открыть несколько браузеров (с разными или одинаковыми адресами) в одно и то же время (например, всплывающие окна) и закрыть их через несколько секунд в том же порядке, в котором они были открыты. Я предположил, что мне нужно использовать многопоточность для этого или я могу использовать Eclipse Job API для этого?

Моя проблема здесь: Я написал ниже код, чтобы открыть несколько браузеров, но он открывает второй браузер после того, как он закрывает первый. Я хочу открыть второй браузер, в то время как первый останется открытым и закроет первый после указанных секунд.

Я использую SWT-4.4-win32-win32-x86, XULRunner-3.6.28.en-US.win32 в Windows 7 с помощью jdk1.8.0_20_32 и Eclipse Luna 4.4.1. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация, чтобы помочь мне.

import org.eclipse.swt.SWT; 
import org.eclipse.swt.browser.Browser; 
import org.eclipse.swt.browser.ProgressEvent; 
import org.eclipse.swt.browser.ProgressListener; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 


public class NestedThread extends Thread{ 

    public static boolean loaded = false; 

    public static void main(String args[]) { 

     String xulrunnerDir = "C:\\XULRunner\\xulrunner3628"; 
     System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xulrunnerDir); 

     String[] urlList = { "http://google.com","http://ipchicken.com"}; 

     final Display display = Display.getDefault(); 

     for (String url : urlList) { 
      createwindow(display, url);    
     } 
    } 

     public static void createwindow(Display display, String url){ 

      Display.getDefault().syncExec(new Runnable() { 
       public void run() { 
        System.out.println("inside run"); 
        loaded = false; 
        final Shell shell = new Shell(display); 
        shell.setLayout(new FillLayout()); 
        shell.setLayout(new FillLayout()); 
        Browser browser = new Browser(shell, SWT.MOZILLA); 
        browser.setUrl(url); 
        shell.open(); 

        browser.addProgressListener(new ProgressListener() { 

         public void changed(ProgressEvent event) 
         { 
         } 
         public void completed(ProgressEvent event) 
         { 
          loaded = true; 
          System.out.println("Loaded"); 
          try { 
           Thread.sleep(3000); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
          shell.close(); 

         } 

         }); 

         while (!shell.isDisposed() && !loaded) { 
          if (!display .readAndDispatch()) display.sleep(); 
         } 

       } 
      }); 

     } 
} 

Я уже потратил больше недели, чтобы сделать это. но я потерпел неудачу. Пожалуйста помоги. Я бы очень признателен за любую помощь. Заранее спасибо.

ответ

0

Хотя вы могли бы решить проблему, используя потоки, это не обязательно. Вы можете использовать Display-timerExec(), чтобы закрыть окно браузера с задержкой. Вот один из возможных решений:

public static void main(String args[]) { 
    Display display = new Display(); 
    createwindow(display, "http://google.com"); 
    createwindow(display, "http://ipchicken.com"); 
    while(display.getShells().length > 0) { 
    if(!display.readAndDispatch()) { 
     display.sleep(); 
    } 
    } 
    display.dispose(); 
} 

static void createwindow(Display display, String url) { 
    final Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 
    Browser browser = new Browser(shell, SWT.NONE); 
    browser.setUrl(url); 
    shell.open(); 
    browser.addProgressListener(new ProgressAdapter() { 
    @Override 
    public void completed(ProgressEvent event) { 
     event.display.timerExec(3000, new Runnable() { 
     @Override 
     public void run() { 
      shell.close(); 
     } 
     }); 
    } 
    }); 
} 

Код открывает окно браузера сразу один за другим, и закрывает каждое окно с задержкой в ​​три секунды. Это также должно работать с SWT.MOZILLA, но я не установил среду выполнения Mozilla и, следовательно, не могу проверить.

Требование к Display.syncExec() в createWindow было излишним, поскольку код работает в потоке пользовательского интерфейса в любом случае.

+0

Спасибо Rüdiger Herrmann за ваш быстрый ответ. Ваш ответ был действительно полезен и решил мою половину проблемы. Мне нужно было использовать SWT.MOZILLA, чтобы я мог изменить прокси (ip и порт) для другого браузера как SWT.NONE использует только системные прокси, и я не знаю, могу ли я изменить системные прокси во время выполнения, чтобы использовать его с каждым новый браузер. По моему ожидаемому результату, если я открою ipchicken.com в двух разных браузерах, он должен показать два разных IP. Еще раз спасибо в Advance !! – Kanhaiya

+0

Привет, Rüdiger Herrmann, я добавляю еще один запрос по этой же программе. Поскольку ваша программа отлично работает, чтобы открывать несколько браузеров один за другим. Не могли бы вы немного изменить свою программу, чтобы открыть второй браузер после того, как предыдущий браузер полностью загружен, плюс несколько секунд задержки. Я пытался сделать это с помощью многопоточности, но это дало мне ошибку «Исключение в потоке» Thread-0 «org.eclipse.swt.SWTException: Недопустимый доступ к потоку». Пожалуйста помоги! Пожалуйста, дайте мне знать, если вы хотите, чтобы я опубликовал еще один вопрос по этой проблеме. Надеюсь услышать тебя позже! – Kanhaiya

+0

@ Kanhaiya, чтобы открывать окна браузера по одному, вы можете _chain_ открывать вызовы. Поместите URL-адреса в стек и сразу после 'shell.close()' вытащите URL из стека и передайте его на 'createWindow()' –