2014-10-05 32 views
0

這是我在本網站的第一篇文章。我希望,我會很快得到幫助,並能夠幫助別人。使用java SWT.MOZILLA和XULRunner的多瀏覽器

我試圖打開多個瀏覽器(與不同或相同的URL)在同一時間(如彈出窗口),並在幾秒鐘後打開它們相同的順序關閉它們。我假設,我需要使用多線程來做到這一點,或者我可以使用Eclipse Job API來做到這一點?

我的問題在這裏:我寫下面的代碼來打開多個瀏覽器,但它打開第二個瀏覽器後關閉第一個。我想打開第二個瀏覽器,而第一個瀏覽器保持打開狀態,並在指定秒數後關閉第一個瀏覽器。

我在windows 7上使用SWT-4.4-win32-win32-x86,XULRunner-3.6.28.en-US.win32,使用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運行時,因此無法驗證。

因爲代碼在UI線程上運行,所以在createWindow中調用Display.syncExec()是不必要的。

+0

感謝RüdigerHerrmann的快速響應。你的回答非常有幫助,解決了我的一半問題。我需要使用SWT.MOZILLA,所以我可以更改不同瀏覽器的代理(IP和端口),因爲SWT.NONE只使用系統代理,我不知道是否可以在運行時更改系統代理以便與每個代理一起使用新的瀏覽器。根據我的預期結果,如果我在兩個不同的瀏覽器中打開ipchicken.com,它應顯示兩個不同的IP。再次感謝提前! – Kanhaiya 2014-10-05 17:02:55

+0

嗨RüdigerHerrmann,我在這個相同的程序中增加了另一個請求。由於您的程序可以很好地依次打開多個瀏覽器。您可以在先前的瀏覽器完全加載並延遲幾秒之後,將您的程序稍微更改爲打開第二個瀏覽器。我試圖使用多線程,但它給我的錯誤「線程中的異常」線程0「org.eclipse.swt.SWTException:無效的線程訪問」。請幫忙!請讓我知道你是否希望我發佈這個問題的另一個問題。我希望儘快獲得你的消息! – Kanhaiya 2014-10-06 02:20:54

+0

@Kanhaiya一次打開一個瀏覽器窗口,您可以打開打開的電話。把URL打開到一個堆棧中,然後在'shell.close()'從堆棧中彈出一個URL並傳遞給'createWindow()' – 2014-10-07 08:16:35