?? swtpane.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 + -