Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java SWT.MOZILLA和XULRunner的多浏览器_Java_Browser_Swt_Xulrunner - Fatal编程技术网

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

使用java SWT.MOZILLA和XULRunner的多浏览器,java,browser,swt,xulrunner,Java,Browser,Swt,Xulrunner,这是我在这个网站上的第一篇帖子。我希望,我能很快得到帮助,并且能够帮助别人 我正在尝试同时打开多个具有不同或相同URL的浏览器,就像弹出窗口一样,并在几秒钟后以相同的打开顺序将其关闭。我假设,我需要使用多线程来实现这一点,或者我可以使用Eclipse作业API来实现这一点 我这里的问题是:我写了下面的代码来打开多个浏览器,但它在关闭第一个浏览器后会打开第二个浏览器。我想在第一个浏览器保持打开状态的同时打开第二个浏览器,并在指定秒后关闭第一个浏览器 我正在windows 7上使用SWT-4.4-w

这是我在这个网站上的第一篇帖子。我希望,我能很快得到帮助,并且能够帮助别人

我正在尝试同时打开多个具有不同或相同URL的浏览器,就像弹出窗口一样,并在几秒钟后以相同的打开顺序将其关闭。我假设,我需要使用多线程来实现这一点,或者我可以使用Eclipse作业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 ();  
                        }

              }
            });

      }
}

我已经花了一个多星期做这件事了。但我失败了。请帮忙。我非常感谢任何人的帮助。提前感谢。

虽然您可以通过使用线程来解决问题,但这并不是必需的。您可以使用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运行时,因此无法验证


在createWindow中调用Display.syncExec是不必要的,因为代码仍然在UI线程上运行。

感谢吕迪格·赫尔曼的快速响应。你的回答真的很有帮助,解决了我一半的问题。我需要使用SWT.MOZILLA,以便将不同浏览器的proxyip和端口更改为SWT。NONE仅使用系统代理,我不知道是否可以在运行时将系统代理更改为与每个新浏览器一起使用。根据我的预期结果,如果我在两个不同的浏览器中打开ipchicken.com,它应该显示两个不同的IP。再次提前感谢!!嗨,Rüdiger Herrmann,我正在为同一个程序添加另一个请求。由于您的程序工作正常,可以一个接一个地打开多个浏览器。在前一个浏览器完全加载后,再加上几秒钟的延迟,请您稍微更改一下程序以打开第二个浏览器。我尝试使用多线程来实现它,但它在thread thread-0 org.eclipse.swt.SWTException中给了我一个异常错误:线程访问无效。请帮忙!请让我知道,如果你想让我作为这个问题的另一个问题张贴。我希望很快收到你的来信@Kanhaiya一次打开一个浏览器窗口,您可以链接打开的呼叫。将要打开的URL放在堆栈中,放在shell之后。关闭从堆栈中弹出一个URL并将其传递给CreateWindow感谢Rudiger,我需要在第一个窗口加载一个小延迟后创建窗口,比如2秒钟,而第一个窗口仍在等待关闭!就像它加载10秒后就会关闭一样。我真的很感谢你的回答!!