这是我在这个网站上的第一篇文章。我希望,我会很快得到帮助,并能够帮助他人。
我正在尝试同时打开多个浏览器(使用不同或相同的网址)(如弹出窗口),并按照打开的相同顺序在几秒钟后关闭它们。我假设,我需要使用多线程来完成它,或者我可以使用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 :(得分: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线程上运行。