swt/Jface模拟ie浏览器

第一种实现Eclipse SWT包:

import java.text.MessageFormat;
import java.util.MissingResourceException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.LocationListener;
import org.eclipse.swt.browser.OpenWindowListener;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.browser.StatusTextEvent;
import org.eclipse.swt.browser.StatusTextListener;
import org.eclipse.swt.browser.TitleEvent;
import org.eclipse.swt.browser.TitleListener;
import org.eclipse.swt.browser.VisibilityWindowListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

public class BrowserExample {
	int index;
	boolean busy;
	Image images[];
	Text location;
	Browser browser;
	static final String[] imageLocations = { "eclipse01.bmp", "eclipse02.bmp",
			"eclipse03.bmp", "eclipse04.bmp", "eclipse05.bmp", "eclipse06.bmp",
			"eclipse07.bmp", "eclipse08.bmp", "eclipse09.bmp", "eclipse10.bmp",
			"eclipse11.bmp", "eclipse12.bmp", };
	static final String iconLocation = "document.gif";

	public BrowserExample(Composite parent) {
		final Display display = parent.getDisplay();
		FormLayout layout = new FormLayout();
		parent.setLayout(layout);
		ToolBar toolbar = new ToolBar(parent, SWT.NONE);
		final ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH);
		itemBack.setText(getResourceString("Back"));
		final ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH);
		itemForward.setText(getResourceString("Forward"));
		final ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH);
		itemStop.setText(getResourceString("Stop"));
		final ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH);
		itemRefresh.setText(getResourceString("Refresh"));
		final ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH);
		itemGo.setText(getResourceString("Go"));
		location = new Text(parent, SWT.BORDER);
		images = new Image[] { new Image(display, "C:/icons/web/go.gif") };
		final Canvas canvas = new Canvas(parent, SWT.NO_BACKGROUND);
		final Rectangle rect = images[0].getBounds();
		canvas.addListener(SWT.Paint, new Listener() {
			public void handleEvent(Event e) {
				Point pt = canvas.getSize();
				e.gc.drawImage(images[index], 0, 0, rect.width, rect.height, 0,
						0, pt.x, pt.y);
			}
		});
		canvas.addListener(SWT.MouseDown, new Listener() {
			public void handleEvent(Event e) {
				browser.setUrl(getResourceString("Startup"));
			}
		});

		display.asyncExec(new Runnable() {
			public void run() {
				if (canvas.isDisposed())
					return;
				if (busy) {
					index++;
					if (index == images.length)
						index = 0;
					canvas.redraw();
				}
				display.timerExec(150, this);
			}
		});
		final Label status = new Label(parent, SWT.NONE);
		final ProgressBar progressBar = new ProgressBar(parent, SWT.NONE);
		FormData data = new FormData();
		data.top = new FormAttachment(0, 5);
		toolbar.setLayoutData(data);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(100, 0);
		data.top = new FormAttachment(canvas, 5, SWT.DEFAULT);
		data.bottom = new FormAttachment(status, -5, SWT.DEFAULT);
		try {
			browser = new Browser(parent, SWT.NONE);
			browser.setLayoutData(data);
		} catch (SWTError e) {
			Label label = new Label(parent, SWT.CENTER | SWT.WRAP);
			label.setText(getResourceString("BrowserNotCreated"));
			label.setLayoutData(data);
		}
		data = new FormData();
		data.width = 24;
		data.height = 24;
		data.top = new FormAttachment(0, 5);
		data.right = new FormAttachment(100, -5);
		canvas.setLayoutData(data);
		data = new FormData();
		data.top = new FormAttachment(toolbar, 0, SWT.TOP);
		data.left = new FormAttachment(toolbar, 5, SWT.RIGHT);
		data.right = new FormAttachment(canvas, -5, SWT.DEFAULT);
		location.setLayoutData(data);
		data = new FormData();
		data.left = new FormAttachment(0, 5);
		data.right = new FormAttachment(progressBar, 0, SWT.DEFAULT);
		data.bottom = new FormAttachment(100, -5);
		status.setLayoutData(data);

		data = new FormData();
		data.right = new FormAttachment(100, -5);
		data.bottom = new FormAttachment(100, -5);
		progressBar.setLayoutData(data);
		if (browser != null) {
			itemBack.setEnabled(browser.isBackEnabled());
			itemForward.setEnabled(browser.isForwardEnabled());

			Listener listener = new Listener() {
				public void handleEvent(Event event) {
					ToolItem item = (ToolItem) event.widget;
					if (item == itemBack)
						browser.back();
					else if (item == itemForward)
						browser.forward();
					else if (item == itemStop)
						browser.stop();
					else if (item == itemRefresh)
						browser.refresh();
					else if (item == itemGo)
						browser.setUrl(location.getText());
				}
			};
			browser.addLocationListener(new LocationListener() {
				public void changed(LocationEvent event) {
					busy = true;
					if (event.top)
						location.setText(event.location);
				}

				public void changing(LocationEvent event) {
				}
			});
			browser.addProgressListener(new ProgressListener() {
				public void changed(ProgressEvent event) {
					if (event.total == 0)
						return;
					int ratio = event.current * 100 / event.total;
					progressBar.setSelection(ratio);
					busy = event.current != event.total;
					if (!busy) {
						index = 0;
						canvas.redraw();
					}
				}

				public void completed(ProgressEvent event) {
					itemBack.setEnabled(browser.isBackEnabled());
					itemForward.setEnabled(browser.isForwardEnabled());
					progressBar.setSelection(0);
					busy = false;
					index = 0;
					canvas.redraw();
				}
			});
			browser.addStatusTextListener(new StatusTextListener() {
				public void changed(StatusTextEvent event) {
					status.setText(event.text);
				}
			});
			if (parent instanceof Shell) {
				final Shell shell = (Shell) parent;
				browser.addTitleListener(new TitleListener() {
					public void changed(TitleEvent event) {
						shell.setText(event.title + " - "
								+ getResourceString("window.title"));
					}
				});
			}
			itemBack.addListener(SWT.Selection, listener);
			itemForward.addListener(SWT.Selection, listener);
			itemStop.addListener(SWT.Selection, listener);
			itemRefresh.addListener(SWT.Selection, listener);
			itemGo.addListener(SWT.Selection, listener);
			location.addListener(SWT.DefaultSelection, new Listener() {
				public void handleEvent(Event e) {
					browser.setUrl(location.getText());
				}
			});
			initialize(display, browser);
			browser.setUrl(getResourceString("Startup"));
		}
	}

	static String getResourceString(String key) {
		try {
			return "key";
		} catch (MissingResourceException e) {
			return key;
		} catch (NullPointerException e) {
			return "!" + key + "!";
		}
	}

	static String getResourceString(String key, Object[] args) {
		try {
			return MessageFormat.format(getResourceString(key), args);
		} catch (MissingResourceException e) {
			return key;
		} catch (NullPointerException e) {
			return "!" + key + "!";
		}
	}

	static void initialize(final Display display, Browser browser) {
		browser.addOpenWindowListener(new OpenWindowListener() {
			public void open(WindowEvent event) {
				System.out.println("Open");
				Shell shell = new Shell(display);
				shell.setLayout(new FillLayout());
				Browser browser = new Browser(shell, SWT.NONE);
				initialize(display, browser);
				event.browser = browser;
			}
		});
		browser.addVisibilityWindowListener(new VisibilityWindowListener() {
			public void hide(WindowEvent event) {
			}

			public void show(WindowEvent event) {
				System.out.println("Show");
				Browser browser = (Browser) event.widget;
				Shell shell = browser.getShell();
				if (event.location != null)
					shell.setLocation(event.location);
				if (event.size != null) {
					Point size = event.size;
					shell.setSize(shell.computeSize(size.x, size.y));
				}
				shell.open();
			}
		});
		browser.addCloseWindowListener(new CloseWindowListener() {
			public void close(WindowEvent event) {
				System.out.println("Close");
				Browser browser = (Browser) event.widget;
				Shell shell = browser.getShell();
				shell.close();
			}
		});
	}

	public void dispose() {
		freeResources();
	}

	void freeResources() {
		if (images != null) {
			for (int i = 0; i < images.length; ++i) {
				final Image image = images[i];
				if (image != null)
					image.dispose();
			}
			images = null;
		}
	}

	public void setFocus() {
		location.setFocus();
	}

	public static void main(String[] args) {

		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
		shell.setText("Browser example");
		BrowserExample instance = new BrowserExample(shell);
		Image icon = new Image(display, "C:/icons/web/go.gif");
		shell.setImage(icon);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		icon.dispose();
		instance.dispose();
		display.dispose();
	}
}

第二种实现Eclipse SWT和JFace包:

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.LocationListener;
import org.eclipse.swt.browser.OpenWindowListener;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.browser.StatusTextEvent;
import org.eclipse.swt.browser.StatusTextListener;
import org.eclipse.swt.browser.TitleEvent;
import org.eclipse.swt.browser.TitleListener;
import org.eclipse.swt.browser.VisibilityWindowListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;

public class SWTBrowser {

	Display display = new Display();
	Shell shell = new Shell(display);
	Text textLocation;
	Browser browser;
	Label labelStatus;

	public SWTBrowser() {

		shell.setLayout(new GridLayout());
		ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
		final ToolBarManager manager = new ToolBarManager(toolBar);
		Composite compositeLocation = new Composite(shell, SWT.NULL);
		compositeLocation.setLayout(new GridLayout(3, false));
		compositeLocation.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		Label labelAddress = new Label(compositeLocation, SWT.NULL);
		labelAddress.setText("Address");
		textLocation = new Text(compositeLocation, SWT.SINGLE | SWT.BORDER);
		textLocation.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		Button buttonGo = new Button(compositeLocation, SWT.NULL);
		buttonGo.setImage(new Image(shell.getDisplay(), "C:/icons/web/go.gif"));
		browser = new Browser(shell, SWT.BORDER);
		browser.setLayoutData(new GridData(GridData.FILL_BOTH));
		Composite compositeStatus = new Composite(shell, SWT.NULL);
		compositeStatus.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		compositeStatus.setLayout(new GridLayout(2, false));
		labelStatus = new Label(compositeStatus, SWT.NULL);
		labelStatus.setText("Ready");
		labelStatus.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		final ProgressBar progressBar = new ProgressBar(compositeStatus,
				SWT.SMOOTH);
		Listener openURLListener = new Listener() {
			public void handleEvent(Event event) {
				browser.setUrl(textLocation.getText());
			}
		};
		buttonGo.addListener(SWT.Selection, openURLListener);
		textLocation.addListener(SWT.DefaultSelection, openURLListener);
		final Action actionBackward = new Action("&Backword",
				ImageDescriptor.createFromFile(null,
						"C:/icons/web/backward.gif")) {
			public void run() {
				browser.back();
			}
		};
		actionBackward.setEnabled(false);
		final Action actionForward = new Action("&Forward",
				ImageDescriptor
						.createFromFile(null, "C:/icons/web/forward.gif")) {
			public void run() {
				browser.forward();
			}
		};
		actionForward.setEnabled(false);
		Action actionStop = new Action("&Stop", ImageDescriptor.createFromFile(
				null, "C:/icons/web/stop.gif")) {
			public void run() {
				browser.stop();
			}
		};
		Action actionRefresh = new Action("&Refresh",
				ImageDescriptor
						.createFromFile(null, "C:/icons/web/refresh.gif")) {
			public void run() {
				browser.refresh();
			}
		};
		Action actionHome = new Action("&Home", ImageDescriptor.createFromFile(
				null, "C:/icons/web/home.gif")) {
			public void run() {
				browser.setUrl("http://www.eclipse.org");
			}
		};
		manager.add(actionBackward);
		manager.add(actionForward);
		manager.add(actionStop);
		manager.add(actionRefresh);
		manager.add(actionHome);
		manager.update(true);
		toolBar.pack();
		browser.addLocationListener(new LocationListener() {
			public void changing(LocationEvent event) {
				textLocation.setText(event.location);
			}

			public void changed(LocationEvent event) {
				actionBackward.setEnabled(browser.isBackEnabled());
				actionForward.setEnabled(browser.isForwardEnabled());
				manager.update(false);
			}
		});
		browser.addProgressListener(new ProgressListener() {
			public void changed(ProgressEvent event) {
				progressBar.setMaximum(event.total);
				progressBar.setSelection(event.current);
			}

			public void completed(ProgressEvent event) {
				progressBar.setSelection(0);
			}
		});
		browser.addStatusTextListener(new StatusTextListener() {
			public void changed(StatusTextEvent event) {
				labelStatus.setText(event.text);
			}
		});
		browser.addTitleListener(new TitleListener() {
			public void changed(TitleEvent event) {
				shell.setText(event.title + " - powered by SWT");
			}
		});
		initialize(display, browser);
		shell.setSize(500, 400);
		shell.open();
		browser.setText("<html><body>" + "<h1>SWT & JFace </h1>"
				+ "</body/html>");
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		display.dispose();
	}

	static void initialize(final Display display, Browser browser) {
		browser.addOpenWindowListener(new OpenWindowListener() {
			public void open(WindowEvent event) {
				Shell shell = new Shell(display);
				shell.setText("New Window");
				shell.setLayout(new FillLayout());
				Browser browser = new Browser(shell, SWT.NONE);
				initialize(display, browser);
				event.browser = browser;
			}
		});
		browser.addVisibilityWindowListener(new VisibilityWindowListener() {
			public void hide(WindowEvent event) {
				Browser browser = (Browser) event.widget;
				Shell shell = browser.getShell();
				shell.setVisible(false);
			}

			public void show(WindowEvent event) {
				Browser browser = (Browser) event.widget;
				Shell shell = browser.getShell();
				if (event.location != null)
					shell.setLocation(event.location);
				if (event.size != null) {
					Point size = event.size;
					shell.setSize(shell.computeSize(size.x, size.y));
				}
				shell.open();
			}
		});
		browser.addCloseWindowListener(new CloseWindowListener() {
			public void close(WindowEvent event) {
				Browser browser = (Browser) event.widget;
				Shell shell = browser.getShell();
				shell.close();
			}
		});
	}

	public static void main(String[] args) {
		new SWTBrowser();
	}
}

小说明: 调用IE浏览器内核, 设置了很好的性质,在ajax爬虫抓取方面有独特的好处. 也处理了httpclient所带来的cookie,header等信息都进行了处理.

转载于: http://www.jb51.net/article/18816_2.htm

效果图如下:



 

猜你喜欢

转载自greatwqs.iteye.com/blog/1213801