📄 sqtbrowser.java
字号:
package demo;
import java.util.HashMap;
import org.eclipse.swt.SWT;
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.Point;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SQTBrowser extends Shell {
protected HashMap<CTabItem, Browser> browserHM = new HashMap<CTabItem, Browser>();
protected Browser currentBrowser = null;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
Display display = Display.getDefault();
SQTBrowser shell = new SQTBrowser(display, SWT.SHELL_TRIM);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the shell
* @param display
* @param style
*/
public SQTBrowser(Display display, int style) {
super(display, style);
createContents();
}
/**
* Create contents of the window
*/
protected void createContents() {
setText("SWT Application");
setSize(568, 441);
//
final Composite compositeLeft;
compositeLeft = new Composite(this, SWT.None);
compositeLeft.setBackground(new Color(null, 255, 255, 255));
compositeLeft.setLayout(new FormLayout());
final FormData formData_1 = new FormData();
formData_1.bottom = new FormAttachment(300, 150);
formData_1.top = new FormAttachment(0, 150);
formData_1.right = new FormAttachment(150, 300);
formData_1.left = new FormAttachment(150, 0);
compositeLeft.setLayoutData(formData_1);
CTabFolder myTabFolder = new CTabFolder(compositeLeft, SWT.None);
myTabFolder.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
myTabFolder.setSelectionBackground(
new Color[] {
Display.getDefault().getSystemColor(SWT.COLOR_TITLE_BACKGROUND),
Display.getDefault().getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT),
Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)},
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);
}
});
createBrowserTab(myTabFolder,"http://www.baidu.com");
}
public void createBrowserTab( final CTabFolder tabFolder, String tabUrl ) {
final CTabItem browserTabItem = new CTabItem(tabFolder, SWT.BORDER|SWT.CLOSE);
browserTabItem.setText("正在打开...");
if ( Display.getDefault()!=null ) {
browserTabItem.setImage(DmStandard.getInterfaceImage(Display.getDefault(), "ie6.ico"));
}
final Composite composite = new Composite(tabFolder, SWT.BORDER);
composite.setLayout(new FillLayout());
browserTabItem.setControl(composite);
final Browser browser = new Browser(composite, SWT.NONE);
if (tabUrl!=null){
browser.setUrl(tabUrl);
}
browserHM.put(browserTabItem, browser);
initialize(tabFolder, browserTabItem, browser);
}
private void initialize(final CTabFolder tabFolder, final CTabItem cti, final Browser browser) {
//选中刚创建的标签
tabFolder.setSelection(cti);
/**
* 设置当前浏览器
*/
currentBrowser = browser;
/**
* 监听双击关闭标签页
*/
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){
System.out.println("close tab " + idx + ".");
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 browser = new Browser(tabFolder, SWT.NONE);
newTabItem.setControl(browser);
initialize(tabFolder, newTabItem, browser);
e.browser = browser;
/**///检测此URL是否已打开,如果是,则关闭刚刚建立的新标签,并定位到存在url对应的TAB标签上
e.display.asyncExec(new Runnable() {
public void run() {
browserHM.put(newTabItem, browser);
}
});
}
});
}
/**
* 监听标签页 CTabItem Dispose() 事件
*/
private void cTabItemDisposeHandler(final DisposeEvent e){
try{
CTabItem cti = (CTabItem)e.widget;
//首先将此销毁的CTabItem和Browser从HashMap中移除
browserHM.remove(cti);
CTabFolder ctf = (CTabFolder)cti.getParent();
//判断如果当前频道没有浏览器时则将导航按钮禁用
if (ctf.getItemCount()==0){
}
//关掉与此标签相关的Composite和Browser
Composite c = (Composite)cti.getControl();
if (!c.isDisposed()){
Control cl = c.getChildren()[0];
if (!cl.isDisposed()) {
cl.dispose();
cl=null;
}
if (!c.isDisposed())c.dispose();
if (!cti.isDisposed())cti.dispose();
}
//有标签被关闭时,获取当前选中的标签,得到当前浏览器
cti = ctf.getSelection();
if ( cti!=null && !cti.isDisposed() ) {
//Browser b =(Browser)((Composite)cti.getControl()).getChildren()[0];
Browser b = browserHM.get(cti);
if ( b!=null ) {
currentBrowser = b;
}
}
} catch (ClassCastException cce){
cce.printStackTrace();
} catch(Exception ex){
ex.printStackTrace();
}
}
/**
* 监听标签页标题事件
*/
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() > 10) {
newTitle = title.substring(0, 10) + "...";
}
return newTitle;
}
/**
* 点击CTabItem时
* @param e
*/
private void selectBrowserTabFolderWidgetSelected(final SelectionEvent e){
try{
//根据所点击的CTabItem获取相应的Browser,然后设置为当前浏览器
Browser b = null;
CTabItem cti = ((CTabFolder)e.widget).getSelection();
if ( cti!=null && !cti.isDisposed() ) {
b = browserHM.get(cti);
}
if ( b!=null && !b.isDisposed() ) {
currentBrowser = b;
}
} catch (ClassCastException cce){
cce.printStackTrace();
}
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -