⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swtpane.java

📁 用java写的一个浏览器
💻 JAVA
字号:
package demo;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Panel;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.TitleEvent;
import org.eclipse.swt.browser.TitleListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SWTPane extends Panel {
	DisplayThread displayThread;
	private Canvas canvas;

	public SWTPane() {
		displayThread = new DisplayThread();
		displayThread.start();
		canvas = new Canvas();
		setLayout(new BorderLayout());
		add(canvas, BorderLayout.CENTER);
	}

	public void addNotify() {
		super.addNotify();
		Display dis = displayThread.getDisplay();
		dis.syncExec(new Runnable() {
			public void run() {
				Shell shell = SWT_AWT.new_Shell(displayThread.getDisplay(),
						canvas);
				shell.setLayout(new FillLayout());

				final Composite composite;
				composite = new Composite(shell, SWT.CENTER);
				composite.setBackground(new Color(null, 255, 255, 255));
				composite.setLayout(new FillLayout());
				
				CTabFolder myTabFolder = new CTabFolder(composite, SWT.CENTER);
				myTabFolder.setBackground(Display.getDefault().getSystemColor(
						SWT.COLOR_WHITE));
				myTabFolder.setSelectionBackground(new Color[] {
						Display.getDefault().getSystemColor(SWT.COLOR_TITLE_BACKGROUND),
						Display.getDefault().getSystemColor(SWT.COLOR_GREEN),
						Display.getDefault().getSystemColor(SWT.COLOR_BLUE) }, 
						new int[] { 50,100 }, true);
				myTabFolder.setBorderVisible(true);
				myTabFolder.setSelectionForeground(Display.getDefault()
						.getSystemColor(SWT.COLOR_WHITE));
				myTabFolder.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(final SelectionEvent e) {
						// selectBrowserTabFolderWidgetSelected(e);
					}
				});
				final CTabItem browserTabItem = new CTabItem(myTabFolder,
						SWT.BORDER | SWT.CLOSE);
				browserTabItem.setText("正在打开...");
				if (Display.getDefault() != null) {
//					browserTabItem.setImage(DmStandard.getInterfaceImage(
//							Display.getDefault(), "ie6.ico"));
					browserTabItem.setImage(getImage(Display.getDefault(),"ie6.ico"));
				}
				final Composite compositeTabFolder = new Composite(myTabFolder,
						SWT.CENTER);
				compositeTabFolder.setLayout(new FillLayout());
				browserTabItem.setControl(compositeTabFolder);
				final Browser browser = new Browser(compositeTabFolder, SWT.CENTER);
				browser.setUrl("http://www.163.com");
				initialize(myTabFolder, browserTabItem, browser);
			}
		});
	}
	
	private void initialize(final CTabFolder tabFolder, final CTabItem cti, final Browser browser) {
		//选中刚创建的标签
		tabFolder.setSelection(cti);

		/**
		 * 监听双击关闭标签页
		 */
		tabFolder.addMouseListener(new MouseAdapter() {
			public void mouseDoubleClick(final MouseEvent e) {
				Point point = new Point(e.x, e.y);
				CTabItem cti = tabFolder.getItem(point);
				if (cti!=null && e.button==1 && !cti.isDisposed())
					cti.dispose();
			}
		});
		/**
		 * 监听标签页 CTabItem Dispose() 事件
		 */
		cti.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(final DisposeEvent e) {
				cTabItemDisposeHandler(e);
			}
		});

		/**
		 * 监听浏览器关闭事件(此事件一般由网页关闭代码触发)
		 */
		browser.addCloseWindowListener(new CloseWindowListener() {
			public void close(WindowEvent event) {
				int idx = tabFolder.getSelectionIndex();
				if (idx >= 0){
					tabFolder.getItem(idx).dispose();
				}
			}
		});
		
		//监听新开标签页标题事件
		browser.addTitleListener(new TitleListener() {
			public void changed(TitleEvent event) {
				browserTitleChangeHandler(cti, event);
			}
		});
		/**
		 * 监听 _blank 网页弹出事件
		 */
		browser.addOpenWindowListener(new org.eclipse.swt.browser.OpenWindowListener() {
				public void open(final org.eclipse.swt.browser.WindowEvent e) {
						final CTabItem newTabItem = new CTabItem(tabFolder,
								SWT.BORDER|SWT.CLOSE);
						final Browser tabBrowser = new Browser(tabFolder, SWT.NONE);
						newTabItem.setControl(tabBrowser);						
						initialize(tabFolder, newTabItem, tabBrowser);
						e.browser = tabBrowser;						
//						/**///检测此URL是否已打开,如果是,则关闭刚刚建立的新标签,并定位到存在url对应的TAB标签上
//						e.display.asyncExec(new Runnable() {
//							public void run() {								
//									System.out.println("sdf");
//							}
//						});
				}
		});
	}
	/**
	 * 监听标签页标题事件
	 */
    private void browserTitleChangeHandler(CTabItem browserTabItem, TitleEvent event){
		if ( browserTabItem != null && !browserTabItem.isDisposed() ) {
			browserTabItem.setText(cutTitle(event.title));
			browserTabItem.setToolTipText(event.title);
		}
    }
    private String cutTitle(String title) {
		String newTitle = title;
		if (title.length() > 15) {
			newTitle = title.substring(0, 15) + "...";
		}
		return newTitle;
	}
    /**
	 * 监听标签页 CTabItem Dispose() 事件
	 */
    private void cTabItemDisposeHandler(final DisposeEvent e){
    	try{
	    	CTabItem cti = (CTabItem)e.widget;
	    	//首先将此销毁的CTabItem和Browser从HashMap中移除
	    	CTabFolder ctf = (CTabFolder)cti.getParent();	    	
	    	//关掉与此标签相关的Composite和Browser
			Composite c = (Composite)cti.getControl();
			if (c!=null&&!c.isDisposed()){
				Control cl = c.getChildren()[0];
				if (!cl.isDisposed()) {
					cl.dispose();
					cl=null;
				}
				if (!c.isDisposed())c.dispose();
				if (!cti.isDisposed())cti.dispose();
			}			
    	} catch (ClassCastException cce){
    		cce.printStackTrace();
    	} catch(Exception ex){
    		ex.printStackTrace();
    	}
    }
    
    private Image getImage( Display d, String imageName){
    	InputStream is = this.getClass().getResourceAsStream(imageName);
    	 try {
             if (is != null) {
                 ImageData imageData = new ImageData(is);
                 if (imageData != null) {
                     return new Image(d, imageData);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 if(is != null)
                     is.close();
             } catch (IOException e1) {
             	e1.printStackTrace();
             }
         }
         return null;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -