您的位置:首页 > 编程语言 > Java开发

Java 实现的简易浏览器

2014-11-22 22:14 302 查看


Java 实现的简易浏览器(Think浏览器的实现

[java] view
plaincopy

/*

* 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();

}

}

时间算是久远了,好多都忘了,大致上就是这样的了,欢迎拍砖哈!

贴图

















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: