Java 实现的简易浏览器
2014-11-22 22:14
302 查看
Java 实现的简易浏览器(Think浏览器的实现)
[java] viewplaincopy
/*
* Name:MainUI
* Writer:bitsjx
* Date:2009-12-07
* Time:00:20
* Function:the MainUI class which implement the basic GUI function
* */
package ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.EditorKit;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;
import javax.swing.text.html.HTMLEditorKit.Parser;
import javax.swing.tree.DefaultMutableTreeNode;
import ui.JMPWindow;
import core.PageList;
import core.PageNode;
import core.ThinkFrame;
public class MainUI extends JFrame {
// 建立主框架
JFrame think = new JFrame("think");
// 建立主菜单栏
JMenuBar menubar = new JMenuBar();
// 文件菜单
JMenu filemenu = new JMenu("文件(F)");
JMenuItem newwindow = new JMenuItem("新窗口(N)");
JMenuItem openfile = new JMenuItem("打开(O)");
JMenuItem saveas = new JMenuItem("另存为(S)");
JMenuItem quit = new JMenuItem("退出(Q)");
// 查看菜单
JMenu watchmenu = new JMenu("查看(V)");
JMenuItem sourcecode = new JMenuItem("源代码(O)");
// 书签菜单
static JMenu bookmarkmenu = new JMenu("书签(B)");
JMenuItem addbookmark = new JMenuItem("添加书签(B)");
// 帮助菜单
JMenu helpmenu = new JMenu("帮助(H)");
JMenuItem help = new JMenuItem("think 帮助");
JMenuItem about = new JMenuItem("关于 think");
// 打开保存对话框
JFileChooser openfilechooser = new JFileChooser("D://");
JFileChooser saveasfilechooser = new JFileChooser("D://");
// 定义三种窗口外观
public final static String Windows = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
public final static String Metal = "javax.swing.plaf.metal.MetalLookAndFeel";
public final static String Motif = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
//定义按钮的图标
ImageIcon bookmarkicon=new ImageIcon(getClass().getResource("/icons/back.png"));
ImageIcon forwardicon=new ImageIcon(getClass().getResource("/icons/forward.png"));
ImageIcon backicon=new ImageIcon(getClass().getResource("/icons/back.png"));
ImageIcon refreshicon=new ImageIcon(getClass().getResource("/icons/refresh.png"));
ImageIcon homeicon=new ImageIcon(getClass().getResource("/icons/home.png"));
ImageIcon goicon=new ImageIcon(getClass().getResource("/icons/go.png"));
ImageIcon stopicon=new ImageIcon(getClass().getResource("/icons/stop.png"));
//建立工具栏
JToolBar toolbar=new JToolBar();
JButton bookmark=new JButton("书签",bookmarkicon);
JButton back=new JButton("后退",backicon);
JButton forward=new JButton("前进",forwardicon);
JButton stop=new JButton("停止",stopicon);
JButton refresh=new JButton("刷新",refreshicon);
JButton home=new JButton("主页",homeicon);
//地址栏
JLabel addresslabel=new JLabel("地址:");
JTextField urlfield = new JTextField(50);
JButton go = new JButton("转到",goicon);
Box addressbox = new Box(BoxLayout.LINE_AXIS);
JToolBar addresstoolbar=new JToolBar();
// 建立显示网页的页面
JEditorPane webpagepane = new JEditorPane();
JScrollPane scrollpane = new JScrollPane(webpagepane);
JScrollPane treescollpane=new JScrollPane();
// 默认主页URL地址
String urladdress = "http://www.baidu.com";
//建立分隔栏
JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
//创建树根节点
DefaultMutableTreeNode root=new DefaultMutableTreeNode("收藏夹");
//创建一个文件节点
DefaultMutableTreeNode homepage=new DefaultMutableTreeNode("主页");
JTree jtree=new JTree(root);
// 建立一个链表来保存历史记录
PageList historylist = new PageList();
// 建立一个链表来保存书签记录
PageList bookmarklist = new PageList();
public MainUI() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
think.setPreferredSize(new Dimension(800,600));
int thinkWidth=this.getPreferredSize().width;
int thinkHeight=this.getPreferredSize().height;
think.setSize(thinkWidth,thinkHeight);
think.setLocation((screenSize.width-thinkWidth)/2,(screenSize.height-thinkHeight)/2);
// 设置窗口属性
//think.setLocationRelativeTo(null);
think.setLayout(new BorderLayout());
think.setTitle("Think");
think.setResizable(true);
// 添加菜单栏
think.setJMenuBar(menubar);
menubar.add(filemenu);
filemenu.setMnemonic('F');
menubar.add(watchmenu);
watchmenu.setMnemonic('V');
menubar.add(bookmarkmenu);
bookmarkmenu.setMnemonic('B');
menubar.add(helpmenu);
helpmenu.setMnemonic('H');
// 添加菜单项
filemenu.add(newwindow);
// 添加键盘快捷方式
newwindow.setMnemonic('N');
newwindow.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
InputEvent.CTRL_MASK));
newwindow.addActionListener(new Action());
filemenu.addSeparator();
filemenu.add(openfile);
openfile.setMnemonic('O');
openfile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
openfile.addActionListener(new Action());
filemenu.add(saveas);
saveas.setMnemonic('S');
saveas.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
InputEvent.CTRL_MASK));
saveas.addActionListener(new Action());
filemenu.addSeparator();
filemenu.add(quit);
quit.setMnemonic('Q');
quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
InputEvent.CTRL_MASK));
quit.addActionListener(new Action());
watchmenu.add(sourcecode);
sourcecode.setMnemonic('U');
sourcecode.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,
InputEvent.CTRL_MASK));
sourcecode.addActionListener(new Action());
bookmarkmenu.add(addbookmark);
addbookmark.setMnemonic('D');
addbookmark.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
InputEvent.CTRL_MASK));
addbookmark.addActionListener(new Action());
helpmenu.add(help);
help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,
InputEvent.BUTTON1_MASK));
help.addActionListener(new Action());
helpmenu.addSeparator();
helpmenu.add(about);
about.addActionListener(new Action());
// 添加工具按钮
toolbar.add(bookmark);
bookmark.setFocusable(false);
bookmark.setEnabled(true);
bookmark.setHorizontalTextPosition(SwingConstants.RIGHT);
bookmark.setVerticalTextPosition(SwingConstants.CENTER);
bookmark.addActionListener(new Action());
toolbar.add(back);
back.setFocusable(false);
back.setEnabled(false);
back.setHorizontalTextPosition(SwingConstants.RIGHT);
back.setVerticalTextPosition(SwingConstants.CENTER);
back.addActionListener(new Action());
toolbar.add(forward);
forward.setFocusable(false);
forward.setEnabled(false);
forward.setHorizontalTextPosition(SwingConstants.RIGHT);
forward.setVerticalTextPosition(SwingConstants.CENTER);
forward.addActionListener(new Action());
toolbar.add(stop);
stop.setFocusable(false);
stop.setHorizontalTextPosition(SwingConstants.RIGHT);
stop.setVerticalTextPosition(SwingConstants.CENTER);
stop.addActionListener(new Action());
toolbar.add(refresh);
refresh.setFocusable(false);
refresh.setHorizontalTextPosition(SwingConstants.RIGHT);
refresh.setVerticalTextPosition(SwingConstants.CENTER);
refresh.addActionListener(new Action());
toolbar.add(home);
home.setFocusable(false);
home.setHorizontalTextPosition(SwingConstants.RIGHT);
home.setVerticalTextPosition(SwingConstants.CENTER);
home.addActionListener(new Action());
toolbar.addSeparator();
addressbox.add(addresslabel,BorderLayout.WEST);
addressbox.add(urlfield,BorderLayout.CENTER);
urlfield.setFocusable(true);
urlfield.addActionListener(new Action());
urlfield.addKeyListener(new KeyAction());
addressbox.add(go,BorderLayout.EAST);
go.setFocusable(false);
go.setHorizontalTextPosition(SwingConstants.RIGHT);
go.setVerticalTextPosition(SwingConstants.CENTER);
go.addActionListener(new Action());
toolbar.add(addressbox);
scrollpane.setPreferredSize(new Dimension(800, 600));
root.add(homepage);
jtree.updateUI();
jtree.addTreeSelectionListener(new TreeNodeChange());
treescollpane.setViewportView(jtree);
splitPane.setDividerLocation(0);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerSize(0);
splitPane.add(treescollpane);
splitPane.add(scrollpane);
// 获得内容面板,将菜单和工具栏添加到内容面板里面
Container contentpane = getContentPane();
// 将menubar放在框架的顶端
setJMenuBar(menubar);
contentpane.add(toolbar, BorderLayout.NORTH);
contentpane.add(splitPane);
//程序加载时载入书签文件
try{
File loadbookmarklist=new File("BookMarkList.txt");
FileReader filereader=new FileReader(loadbookmarklist);
BufferedReader bufferedreader=new BufferedReader(filereader);
//临时存放网页标题
String temp="";
//临时存放网页URL
String content="";
String linesep=System.getProperty("line.separator");
while((temp=bufferedreader.readLine())!=null)
{
//由于每个标题对应一个网址,所以一次可以读取两行
content=bufferedreader.readLine();
//将书签重新添加到树节点上
DefaultMutableTreeNode treenode=new DefaultMutableTreeNode(temp);
root.add(treenode);
jtree.updateUI();
bookmarklist.addURL(temp, content);
}
bufferedreader.close();
filereader.close();
}catch(IOException event){
event.printStackTrace();
JOptionPane.showMessageDialog(MainUI.this, "书签文件打开失败,可能是文件已丢失!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
//设置窗口关闭监听事件
this.addWindowListener(new WindowState());
this.addWindowStateListener(new WindowState());
setNewPage(0, urladdress);
}
//获得url地址的内容
public String getContent(String urladdress)
{
String linesep;
String line="";
String tempsource="";
linesep=System.getProperty("line.separator");
try {
//用输入输出流读取URL对象
URL source=new URL(urladdress);
URLConnection urlconnection=source.openConnection();
String encoding=urlconnection.getContentEncoding();
System.out.println(encoding);
InputStream inputstream=urlconnection.getInputStream();
//由于有的网页使用的字符集不同,导致有的网页源代码打开的时候出现乱码
//此时utf-8可以使用,但是会导致保存之后的网页
//在别的浏览器中打开的时候,依然是乱码
InputStreamReader inputstreamreader=new InputStreamReader(inputstream,"utf-8");
BufferedReader bufferedreader=new BufferedReader(inputstreamreader);
while((line=bufferedreader.readLine())!=null)
{
tempsource=tempsource+line+linesep;
}
//关闭流
inputstream.close();
bufferedreader.close();
} catch (IOException e) {
e.printStackTrace();
}
return tempsource;
}
//重设页面
public void setNewPage(int flag,String urladdress)
{
String temp=getContent(urladdress);
String title=getTitle(temp);
try {
urlfield.setText(urladdress);
webpagepane.setEditable(false);
webpagepane.setPage(urladdress);
if(historylist.isPrePageNameExist(title))
{
back.setEnabled(true);
}
if(historylist.isNextPageNameExist(title))
{
forward.setEnabled(true);
}
urlfield.repaint();
webpagepane.repaint();
} catch (IOException e) {
e.printStackTrace();
}
// 添加进历史链表
if(flag==0)
{
historylist.addURL(title,urladdress);
}
webpagepane.addHyperlinkListener(new HTMLView());
}
//获取网页标题
public String getTitle(String htmlcontent)
{
String temp="";
String regex="<[Tt][Ii][Tt][Ll][Ee]>([^</[Tt][Ii][Tt][Ll][Ee]>]*)";
Pattern pat = Pattern.compile(regex);
Matcher match = pat.matcher(htmlcontent);
while (match.find()) {
int start = match.start();
int end = match.end();
temp = htmlcontent.substring(start+7, end-1);
}
return temp;
}
//退出时处理书签文件的保存
public void savebookmarklist()
{
File savefile=new File("BookMarkList.txt");
String linesep=System.getProperty("line.separator");
try{
FileWriter filewriter=new FileWriter(savefile);
BufferedWriter bufferedwriter=new BufferedWriter(filewriter);
//将bookmarklist链表里面保存的记录一次写入文件
String temppagename="";
String tempurladdress="";
PageNode head=bookmarklist.getPageNode().getNext();
while(head!=null)
{
//读取链表里面的内容
temppagename=head.getPagename();
temppagename=temppagename+linesep;
tempurladdress=head.getUrl();
tempurladdress=tempurladdress+linesep;
bufferedwriter.write(temppagename);
bufferedwriter.write(tempurladdress);
head=head.getNext();
}
bufferedwriter.close();
filewriter.close();
}catch(IOException event){
JOptionPane.showMessageDialog(MainUI.this, "书签列表保存失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
// 处理事件的类
private class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 处理菜单事件
if (e.getSource() == newwindow) {
// 生成新窗体
ThinkFrame core=new ThinkFrame();
}
// 打开文件,由于不会解析HTML文件,只能以源代码的形式读出来了
if (e.getSource() == openfile) {
openfilechooser.setDialogTitle("打开");
openfilechooser.setDialogType(JFileChooser.OPEN_DIALOG);
int result = openfilechooser.showOpenDialog(MainUI.this);
File fileopen=openfilechooser.getSelectedFile();
String openfilename=fileopen.getPath();
System.out.println(openfilename);
if (result == JFileChooser.APPROVE_OPTION) {
// 从硬盘目录下读取文件
try{
FileReader filereader=new FileReader(openfilename);
BufferedReader bufferedreader=new BufferedReader(filereader);
String temp="";
String content="";
String linesep=System.getProperty("line.separator");
while((temp=bufferedreader.readLine())!=null)
{
content=content+temp+linesep;
}
bufferedreader.close();
filereader.close();
urlfield.setText(openfilename);
urlfield.revalidate();
webpagepane.setText(content);
webpagepane.revalidate();
}catch(IOException event){
event.printStackTrace();
JOptionPane.showMessageDialog(MainUI.this, "试图打开源代码文件失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
}
// 页面另存为
if (e.getSource() == saveas) {
urladdress = urlfield.getText().toString().trim();
//设置弹出对话框类型
saveasfilechooser.setDialogTitle("另存为...");
saveasfilechooser.setDialogType(JFileChooser.SAVE_DIALOG);
int result = saveasfilechooser.showSaveDialog(MainUI.this);
//获取文件名
File filesave=saveasfilechooser.getSelectedFile();
String savefilename=filesave.getPath();
savefilename=savefilename+".html";
if (result == JFileChooser.APPROVE_OPTION) {
try{
//将文件存盘
String temp=getContent(urladdress);
FileWriter filewriter=new FileWriter(savefilename);
BufferedWriter bufferedwriter=new BufferedWriter(filewriter);
bufferedwriter.write(temp);
bufferedwriter.close();
filewriter.close();
}catch(IOException event){
JOptionPane.showMessageDialog(MainUI.this, "Web页面保存失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
}
// 退出浏览器
if (e.getSource() == quit) {
if (JOptionPane.showConfirmDialog(MainUI.this, "确定要退出吗?",
"Think 提示您:", JOptionPane.OK_CANCEL_OPTION) == 0) {
//退出时将书签记录写入文件
savebookmarklist();
System.exit(0);
} else {
// Do Nothing
}
}
// 查看源代码
if (e.getSource() == sourcecode) {
urladdress = urlfield.getText().toString().trim();
if (urladdress.length() > 0
&& !urladdress.startsWith("http://")) {
urladdress = "http://"+urladdress;
}
if(!urladdress.equals(""))
{
String temp=getContent(urladdress);
String title=getTitle(temp);
temp=getContent(urladdress);
//建立源代码窗体对象
JMPWindow viewsourcecode=new JMPWindow(title,temp);
viewsourcecode.setVisible(true);
}
else if (urladdress.length() == 0) {
JOptionPane.showMessageDialog(MainUI.this, "对不起,你输入了空地址,这是非法操作!","Think 提示您:",JOptionPane.WARNING_MESSAGE);
}
}
// 添加页面到书签
if (e.getSource() == addbookmark)
{
urladdress = urlfield.getText().toString().trim();
String temp=getContent(urladdress);
String title=getTitle(temp);
if(title!=""&&urladdress!="")
{
if (bookmarklist.isPageNameExist(title) == false)
{
bookmarklist.addURL(title,urladdress);
System.out.println("书签");
System.out.println(title);
System.out.println(urladdress);
//生成收藏夹窗口对象
AddBookMark addbookmarkdone=new AddBookMark(title,urladdress,false);
addbookmarkdone.setVisible(true);
DefaultMutableTreeNode node=new DefaultMutableTreeNode(title);
root.add(node);
jtree.updateUI();
}
else if(bookmarklist.isPageNameExist(title) == true)
{
AddBookMark addbookmarkdone=new AddBookMark(title,urladdress,true);
addbookmarkdone.setVisible(true);
}
}
else
{
JOptionPane.showMessageDialog(MainUI.this, "添加书签标题或者网址不能为空!","Think 提示您:",JOptionPane.WARNING_MESSAGE);
}
}
// 打开帮助文档
if (e.getSource() == help) {
// 待写一个chm格式的文档
JMPWindow viewhelp=new JMPWindow();
viewhelp.setVisible(true);
}
// 打开关于窗口
if (e.getSource() == about) {
JOptionPane.showMessageDialog(MainUI.this, "Think version 0.1"
+ "/n" + "谢谢您的使用!", "关于 Think",
JOptionPane.INFORMATION_MESSAGE);
}
// 单击书签按钮事件:显示/隐藏
if(e.getSource()==bookmark)
{
if(splitPane.getDividerLocation()==250)
{
splitPane.setDividerLocation(0);
}
else
{
splitPane.setDividerLocation(250);
}
}
// 后退事件
if (e.getSource() == back) {
urladdress = urlfield.getText().toString().trim();
try {
// 获得历史链表中的前一个URL地址
String pagename="";
if(historylist.isPrePageNameExist(urladdress))
{
pagename= historylist.getPrePageName(pagename);
urladdress=historylist.getURL(pagename);
MainUI.this.setNewPage(1,urladdress);
}
}catch (Exception event) {
event.printStackTrace();
JOptionPane.showMessageDialog(MainUI.this, "网络连接失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
// 前进事件
if (e.getSource() == forward) {
urladdress = urlfield.getText().toString().trim();
try {
String pagename="";
if(historylist.isNextPageNameExist(urladdress))
{
// 获得历史链表中的下一个URL地址
pagename= historylist.getNextPageName(pagename);
System.out.println(pagename);
urladdress=historylist.getURL(pagename);
MainUI.this.setNewPage(1,urladdress);
}
} catch (Exception event) {
event.printStackTrace();
JOptionPane.showMessageDialog(MainUI.this, "网络连接失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
//停止事件
if (e.getSource() == stop) {
//将页面置空
urladdress = "";
MainUI.this.setNewPage(1,urladdress);
}
// 刷新事件
if (e.getSource() == refresh) {
urladdress = urlfield.getText().toString().trim();
MainUI.this.setNewPage(1,urladdress);
}
// 回到主页
if (e.getSource() == home) {
urladdress = "http://www.baidu.com";
MainUI.this.setNewPage(0,urladdress);
}
// 单击go或者回车事件
if ((e.getSource() == go) || (e.getSource() == urlfield)) {
urladdress = urlfield.getText().toString().trim();
if (urladdress.length() > 0 && urladdress.startsWith("http://")) {
MainUI.this.setNewPage(0,urladdress);
} else if (urladdress.length() > 0
&& !urladdress.startsWith("http://")) {
urladdress = "http://"+urladdress;
MainUI.this.setNewPage(0,urladdress);
} else if (urladdress.length() == 0) {
JOptionPane.showMessageDialog(MainUI.this, "对不起,你输入了空地址,这是非法操作!","Think 提示您:",JOptionPane.WARNING_MESSAGE);
}
}
}
}
// 实现HyperlinkListener方法,实现页面内的超链接
private class HTMLView implements HyperlinkListener {
@Override
public void hyperlinkUpdate(HyperlinkEvent event) {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
JEditorPane pane = (JEditorPane) event.getSource();
if (event instanceof HTMLFrameHyperlinkEvent) {
//处理超链接
HTMLFrameHyperlinkEvent htmlframehyperlinkevent = (HTMLFrameHyperlinkEvent) event;
HTMLDocument htmldocument = (HTMLDocument) pane.getDocument();
htmldocument.processHTMLFrameHyperlinkEvent(htmlframehyperlinkevent);
} else {
try {
String linkurl = event.getURL().toString();
String temp=getContent(linkurl);
String title=getTitle(temp);
pane.setPage(linkurl);
pane.setEditable(false);
urlfield.setText(linkurl);
urlfield.revalidate();
pane.invalidate();
webpagepane.addHyperlinkListener(new HTMLView());
historylist.addURL(title,linkurl);
} catch (IOException t) {
t.printStackTrace();
JOptionPane.showMessageDialog(MainUI.this, "网络连接失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
}
}
}
//键盘监听事件类
private class KeyAction extends KeyAdapter
{
public void keyPressed(KeyEvent e) {
char key=e.getKeyChar();
//按下回车键
if(key=='/n')
{
urladdress = urlfield.getText().toString().trim();
if (urladdress.length() > 0 && urladdress.startsWith("http://")) {
MainUI.this.setNewPage(0,urladdress);
} else if (urladdress.length() > 0
&& !urladdress.startsWith("http://")) {
urladdress = "http://"+urladdress;
MainUI.this.setNewPage(0,urladdress);
} else if (urladdress.length() == 0) {
JOptionPane.showMessageDialog(MainUI.this, "对不起,你输入了空地址,这是非法操作!","Think 提示您:",JOptionPane.WARNING_MESSAGE);
}
}
}
}
//监听树节点改变的事件
private class TreeNodeChange implements TreeSelectionListener {
@Override
public void valueChanged(TreeSelectionEvent e) {
JTree tree=(JTree)e.getSource();
DefaultMutableTreeNode selectednode=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
String nodename=selectednode.toString();
if(selectednode.isLeaf())
{
if(bookmarklist.isPageNameExist(nodename))
{
//获取节点名字
String tempurl=bookmarklist.getURL(nodename);
setNewPage(0,tempurl);
}
else if(nodename.equalsIgnoreCase("主页"))
{
String tempurl="http://www.baidu.com";
setNewPage(0,tempurl);
}
}
}
}
//鉴定窗口大小改变的类
private class WindowState extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
if (JOptionPane.showConfirmDialog(MainUI.this, "确定要退出吗?",
"Think 提示您:", JOptionPane.OK_CANCEL_OPTION) == 0) {
//退出时将书签记录写入文件
savebookmarklist();
System.exit(0);
} else {
// Do Nothing
}
}
public void windowStateChanged(WindowEvent e)
{
splitPane.setDividerSize(0);
}
}
}
[java] view
plaincopy
/*
* Name:JMPWindow.java
* Writer:bitsjx
* Date:2009-12-07
* Time:00:20
* Function:Use class MainUI to implement a JMPWindow GUI
* */
package ui;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class JMPWindow extends JFrame implements ActionListener
{
//面板容器
JPanel contentpane;
//两个单独的面板
JPanel textpanel=new JPanel();
JPanel buttonpanel=new JPanel();
//声明文本区域用于显示源代码
JTextArea textarea=new JTextArea();
JScrollPane scrollpane=new JScrollPane();
//保存和关闭按钮
JButton closebutton=new JButton("关闭");
JButton savebutton=new JButton("保存");
//源文件
String sourcecode="";
//页面名称
String pageName="";
public JMPWindow()
{
//设置窗口属性
this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
this.setSize(new Dimension(800,600));
this.setTitle("帮助");
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//添加面板
contentpane=(JPanel)getContentPane();
contentpane.setLayout(new BorderLayout());
scrollpane.getViewport().add(textarea);
textpanel.setLayout(new BorderLayout());
textpanel.add(scrollpane,BorderLayout.CENTER);
contentpane.add(textpanel,BorderLayout.CENTER);
//设置按钮区域
buttonpanel.setLayout(new FlowLayout());
buttonpanel.add(closebutton);
closebutton.setFocusable(true);
contentpane.add(buttonpanel,BorderLayout.SOUTH);
String linesep="";
linesep=System.getProperty("line.separator");
String readme="";
String temp="";
try {
//读取readme文件
File readmefile=new File("readme.txt");
FileReader filereader;
filereader = new FileReader(readmefile);
BufferedReader bufferedreader=new BufferedReader(filereader);
while((temp=bufferedreader.readLine())!=null)
{
readme=readme+temp+linesep;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(JMPWindow.this,"读取帮助文件出错!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
//readme不可编辑
this.textarea.setEditable(false);
this.textarea.setText(readme);
closebutton.addActionListener(this);
}
public JMPWindow(String title,String urladdress)
{
//设置窗口属性
this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
this.sourcecode=urladdress;
this.setSize(new Dimension(800,600));
this.setTitle("源代码");
this.pageName=title;
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//添加面板
contentpane=(JPanel)getContentPane();
contentpane.setLayout(new BorderLayout());
scrollpane.getViewport().add(textarea);
textpanel.setLayout(new BorderLayout());
textpanel.add(scrollpane,BorderLayout.CENTER);
contentpane.add(textpanel,BorderLayout.CENTER);
//设置按钮区域
buttonpanel.setLayout(new FlowLayout());
buttonpanel.add(savebutton);
savebutton.setFocusable(true);
buttonpanel.add(closebutton);
closebutton.setFocusable(false);
contentpane.add(buttonpanel,BorderLayout.SOUTH);
this.textarea.setEditable(false);
this.textarea.setText(sourcecode);
savebutton.addActionListener(this);
closebutton.addActionListener(this);
}
//响应按钮事件
@Override
public void actionPerformed(ActionEvent e) {
String url="";
if(e.getSource()==closebutton)
{
dispose();
}
else if(e.getSource()==savebutton)
{
//若单击保存按钮,则弹出保存对话框
JFileChooser filechooser=new JFileChooser();
filechooser.setDialogType(JFileChooser.SAVE_DIALOG);
int returnvalue=filechooser.showSaveDialog(JMPWindow.this);
File savefile=filechooser.getSelectedFile();
String savefilename=savefile.getPath();
savefilename=savefilename+".html";
try{
FileWriter filewriter=new FileWriter(savefilename);
BufferedWriter bufferedwriter=new BufferedWriter(filewriter);
bufferedwriter.write(textarea.getText());
bufferedwriter.close();
filewriter.close();
}catch(IOException event){
JOptionPane.showMessageDialog(JMPWindow.this, "保存失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
}
}
}
[java] view
plaincopy
/*
* Name:AddBookMark.java
* Writer:bitsjx
* Date:2009-12-07
* Time:00:20
* Function:Use class MainUI to implement a AddBookMark GUI
* */
package ui;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class AddBookMark extends JFrame implements ActionListener {
//定义组件
JPanel contentpane;
//添加文本区域的面板
JPanel textpanel=new JPanel();
//添加按钮的面板
JPanel buttonpanel=new JPanel();
//名称、地址
JLabel namelabel=new JLabel("名称");
JLabel addresslabel=new JLabel("地址");
//显示名称和地址的文本框
JTextField nametext=new JTextField(20);
JTextField addresstext=new JTextField(20);
//确定、取消按钮
JButton OKbuuton=new JButton("确定");
JButton Cancelbuuton=new JButton("取消");
//isExist用于判断是否已经存在书签项
boolean isExist=false;
public AddBookMark(String title,String urladdress,boolean isExist)
{
//设置窗口属性
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
this.setSize(new Dimension(300,150));
this.setTitle(" 收藏夹");
this.isExist=isExist;
//设置窗体属性
contentpane=(JPanel)this.getContentPane();
contentpane.setLayout(new BorderLayout());
textpanel.setLayout(new FlowLayout());
textpanel.add(namelabel);
textpanel.add(nametext);
nametext.setEnabled(true);
nametext.setText(title);
nametext.setFocusable(true);
textpanel.add(addresslabel);
textpanel.add(addresstext);
addresstext.setEditable(true);
addresstext.setText(urladdress);
buttonpanel.setLayout(new FlowLayout());
buttonpanel.add(OKbuuton);
OKbuuton.setFocusable(false);
buttonpanel.add(Cancelbuuton);
Cancelbuuton.setFocusable(false);
contentpane.add(textpanel,BorderLayout.CENTER);
contentpane.add(buttonpanel,BorderLayout.SOUTH);
OKbuuton.addActionListener(this);
Cancelbuuton.addActionListener(this);
}
//响应按钮事件
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==Cancelbuuton)
{
dispose();
}
if(e.getSource()==OKbuuton)
{
//如果存在了书签项
if(this.isExist==true)
{
if (JOptionPane.showConfirmDialog(AddBookMark.this, "项目已存在,是否覆盖?",
"Think 提示您:", JOptionPane.OK_CANCEL_OPTION)==0) {
}
}
dispose();
}
}
}
[java] view
plaincopy
/*
* Name:PageList.java
* Writer:bitsjx
* Date:2009-12-07
* Time:00:26
* Function:Construct a LinkList to save History and BookMarks Nodes
* */
package core;
public class PageList {
//头节点
private PageNode head;
//自由节点
private PageNode link;
//记录当前的节点所在位置
private PageNode linkpointer;
public PageList()
{
head=new PageNode();
link=head;
linkpointer=head;
}
//添加新的页面到链表
public void addURL(String pagename,String urladdress)
{
PageNode node=new PageNode();
link=head;
while(link.getNext()!=null)
{
link=link.getNext();
}
node.setPagename(pagename);
node.setUrl(urladdress);
link.setNext(node);
node.setPre(link);
node.setNext(null);
linkpointer=node;
}
//获得链表头
public PageNode getPageNode()
{
return this.head;
}
//查找某个pagename对应的URL
public String getURL(String pagename)
{
link=head;
String url="";
while(!((link.getNext()).getPagename()).equalsIgnoreCase(pagename))
{
link=link.getNext();
}
url=(link.getNext()).getUrl();
linkpointer=link;
return url;
}
//获取某个URL对应的pagename
public String getPageName(String urladdress)
{
link=head;
String pagename="";
while(!(link.getNext().getUrl()).equalsIgnoreCase(urladdress))
{
link=link.getNext();
}
pagename=link.getNext().getPagename();
linkpointer=link;
return pagename;
}
//获取当前pagename的前一个pagename
public String getPrePageName(String pagename)
{
link=linkpointer.getPre();
linkpointer=link;
return link.getPagename();
}
//获取当前pagename的下一个pagename
public String getNextPageName(String pagename)
{
link=linkpointer.getNext();
linkpointer=link;
return link.getPagename();
}
//查找某个pagename地址是否存在
public boolean isPageNameExist(String pagename)
{
link=this.head.getNext();
//标记是否找到
boolean isfind=false;
String pageName="";
while(link!=null)
{
pageName=link.getPagename();
if(pageName.equalsIgnoreCase(pagename))
{
isfind=true;
break;
}
link=link.getNext();
}
System.out.println("查找本页结果:"+isfind);
return isfind;
}
//判断某个pagename的前一个pagename是否存在
public boolean isPrePageNameExist(String pagename)
{
boolean isfind=false;
link=head;
link=linkpointer.getPre();
if(link!=null&&link!=head)
{
isfind=true;
}
System.out.println("查找前页结果:"+isfind);
return isfind;
}
//判断某个pagename的后一个pagename是否存在
public boolean isNextPageNameExist(String pagename)
{
boolean isfind=false;
link=head;
link=linkpointer.getNext();
if(link!=null)
{
isfind=true;
}
System.out.println("查找后页结果:"+isfind);
return isfind;
}
}
[java] view
plaincopy
/*
* Name:PageNode.java
* Writer:bitsjx
* Date:2009-12-07
* Time:00:20
* Function:implement a Node of LinkList
* */
package core;
public class PageNode {
//页面的名称
private String pagename="";
//url为网址实例
private String url="";
//next为后一个节点
private PageNode next=null;
//pre为前一个节点
private PageNode pre=null;
//get、set方法
public String getPagename() {
return pagename;
}
public void setPagename(String pagename) {
this.pagename = pagename;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public PageNode getNext() {
return next;
}
public void setNext(PageNode next) {
this.next = next;
}
public PageNode getPre() {
return pre;
}
public void setPre(PageNode pre) {
this.pre = pre;
}
//重写默认构造函数
public PageNode()
{
this.pagename="";
this.url="";
this.next=null;
this.pre=null;
}
//自定义构造函数
public PageNode(String pagename,String urladdress)
{
this.pagename=pagename;
this.url=urladdress;
this.next=null;
this.pre=null;
}
}
[java] view
plaincopy
/*
* Name:ThinkFrame.java
* Writer:bitsjx
* Date:2009-12-07
* Time:00:20
* Function:Use class MainUI to implement a GUI
* */
package core;
import ui.MainUI;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
public class ThinkFrame {
public ThinkFrame()
{
//设置窗口外观
try {
UIManager.setLookAndFeel(new com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(new MainUI(), "GUI初始化失败!","Think 提示您:",JOptionPane.ERROR_MESSAGE);
}
MainUI ui=new MainUI();
ui.pack();
ui.setVisible(true);
}
public static void main(String[] args) {
ThinkFrame core=new ThinkFrame();
}
}
时间算是久远了,好多都忘了,大致上就是这样的了,欢迎拍砖哈!
贴图
相关文章推荐
- Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
- Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
- Java 实现的简易浏览器(Think浏览器的实现)
- Java实现用浏览器打开网址
- 一个简易的流水账号实现方式(java)
- 使用Java在Web上实现简易干特图之四
- 使用Java在Web上实现简易干特图之六
- 使用Java在Web上实现简易干特图之六
- 在windows上java实现关闭浏览器
- 用Java实现的一个本地文件浏览器
- 使用Java在Web上实现简易干特图之三
- java实现的简易线程池框架源码
- 使用Java在Web上实现简易干特图之五
- java web filter实现浏览器不缓存页面
- JAVA浏览器实现方式
- java访问站点 并实现简易网络爬虫
- 使用Java在Web上实现简易干特图之一
- 使用Java在Web上实现简易干特图之二
- 使用Java在Web上实现简易干特图之一
- 使用Java实现简易的HTTP服务器