SWT浏览器设计
先赞一下swt,正是有了它很多东西才这么简单。
废话不多说,先介绍下几个基本情况。由于swt可以使用了系统的资源,所以你在window下使用的浏览器的内核实际上就是ie,这样好处是很大的,比如显示就不会有什么问题,处理js、css也不会有什么大碍 。
收藏夹也可以直接使用ie的,不过为了区分我没有这样做。
主要几个需要处理的地方:
1、 新窗口打开。
有的网页是用_blank来打开的,还有的用户会右键新窗口打开,所以必须处理下,默认的情况是用系统默认浏览器打开。
具体的方法可以参考:
//为浏览器加入打开新窗口事件
browser.addOpenWindowListener(new OpenWindowListener() {
public void open(final WindowEvent e) {
//新建一个窗口
Shell shell = new Shell();
//初始化这个窗口,并将事件e当做参数传给它
createContents(shell, e);
//打开新窗口
shell.open();
shell.layout();
}
});
if (e == null) {
//如果传来的窗口事件为空,那么意味着是第一次打开,就打开设置的主页
setHomePage(browser);
} else {
//如果不为空则打开你想要打开的页面
e.browser = browser;
}
关键是e.browser = browser;这句话,将e的事件用我的浏览器打开。
2、 前进后退实现。
我是用了两个堆栈分别保存前进后退的,当前页不在堆栈中,点击前进后退分别处理。
以下为参考代码:
bBack.setText("后退");
bBack.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
if (!back.isEmpty()) {
String url = back.pop();
forward.push(browser.getUrl());
browser.setUrl(url);
}
checkEnable(back, bBack, forward, bGo);
}
});
bBack.setEnabled(false);
//前进
bGo.setText("前进");
bGo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
//如果前进栈不为空,那么定点出栈,将定点 设置为当前页,将当前页入后退栈
if (!forward.isEmpty()) {
String url = forward.pop();
back.push(browser.getUrl());
browser.setUrl(url);
}
checkEnable(back, bBack, forward, bGo);
}
});
bGo.setEnabled(false);
public void checkEnable(Stack<String> back, ToolItem bBack,
Stack<String> forward, ToolItem bForward) {
if (back.isEmpty()) {
bBack.setEnabled(false);
}
if (!forward.isEmpty()) {
bForward.setEnabled(true);
}
if (forward.isEmpty()) {
bForward.setEnabled(false);
}
if (!back.isEmpty()) {
bBack.setEnabled(true);
}
}
3、 网页的保存。
时间和能力有限,这边我是比较省略了,参考网上某些大牛的写法,还是可以实现ie的全部功能的,甚至可以保存成mht的归档文件。
我是直接保存了网页的html代码就过了哦。
参考代码:
final MenuItem saveAs = new MenuItem(menu_1, SWT.NONE);
saveAs.setText("另存为..");
saveAs.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
FileDialog save = new FileDialog(shell, SWT.SAVE);
save.setFilterExtensions(new String[] { "*.htm,*.html" });
save.setFileName(shell.getText());
String path;
if ((path = save.open()) != null) {
if (!path.endsWith(".htm") && !path.endsWith(".html")
&& !path.endsWith(".HTM")
&& !path.endsWith(".HTML")) {
path += ".html";
}
try {
BufferedWriter out = new BufferedWriter(new FileWriter(
path));
out.write(browser.getText());
out.close();
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
});
4、 收藏夹、历史的实现
没有使用window里面的fav文件夹,我是直接保存进access的,很简单,这里就不献丑了。
下面是全部的代码打包,要调试的话可能需要你另外加上swt包了,顺便说下我是用了swtdesigner6.7进行gui设计的,可能需要安装才能调试代码。