使用java SWT.MOZILLA和XULRunner的多个浏览器

时间:2014-10-05 05:34:52

标签: java browser swt xulrunner

这是我在这个网站上的第一篇文章。我希望,我会很快得到帮助,并能够帮助他人。

我正在尝试同时打开多个浏览器(使用不同或相同的网址)(如弹出窗口),并按照打开的相同顺序在几秒钟后关闭它们。我假设,我需要使用多线程来完成它,或者我可以使用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 ();  
                        }

              }
            });

      }
}

我已经花了一个多星期的时间来做这件事。但我失败了。请帮忙。我真的很感激任何人的帮助。提前谢谢。

1 个答案:

答案 0 :(得分: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是不必要的,因为代码仍会在UI线程上运行。