自制简单浏览器

使用 jswing 自制一个简单的浏览器  实现 浏览网络 ,本地资源, 有前进 ,后退 ,刷新,文件新建等

package com.itheima.net;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;

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.JTextField;
import javax.swing.JToolBar;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.filechooser.FileFilter;
/**
 * 实现web浏览器 支持 HTML的
 * @author Bin
 *
 */
public class TextWebBrowser extends JFrame implements HyperlinkListener {
	private static final long serialVersionUID = 1L;

	JEditorPane Pane;    				//显示HTML的面板
	JLabel messageLine;  				//最底下的状态栏
	JTextField url;						//网址URL的输入栏
	JFileChooser fileChooser; 			//文件选择器
	JButton back;						//后退按钮
	JButton forward;					//前进按钮
	java.util.List historyReport=new ArrayList(); //保存历史记录的李诶博阿
	
	int current=-1;						//当前页面在历史记录中的位置
	public static final int maxHistory=50;  //当超过50时消除历史记录
	static int count=0;						//当前已经打开的浏览器窗口数
	static boolean exit=false;				//是否已退出
	String home="http://www.baidu.com";		//默认的主页
	
	//构造方法
	public TextWebBrowser() throws HeadlessException {
		super("TextWebBrowser");
		Pane=new JEditorPane(); 			//新建面板
		Pane.setEditable(false);			//不可编辑
		Pane.addHyperlinkListener(this);	//注册事件处理器,用于超链接事件
		this.getContentPane().add(new JScrollPane(Pane),BorderLayout.CENTER);  //将面板放入主窗口中,并居中
		
		messageLine=new JLabel(" ");		//创建状态栏 
		this.getContentPane().add(messageLine,BorderLayout.SOUTH);
		this.initMenu();					//调用方法初始化菜单
		this.initToolbar();					//调用方法初始化工具烂
		TextWebBrowser.count++; 			//每创建一个 浏览器创建  记录数累加
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				close();
			}
		});
	}

	//初始化菜单栏
	private void initMenu() {
		JMenu fileMenu=new JMenu("文件");					//创建文件菜单项
		fileMenu.setMnemonic('F');						//设置快捷键
		
		//新建
		JMenuItem newMenuItem=new JMenuItem("新建");		//创建新建项
		newMenuItem.setMnemonic('N');					//设置快捷键
		//新建触发开发窗口 事件
		newMenuItem.addActionListener(new ActionListener() { 
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				newBrower();					//调用打开新窗口的方法
			}
		});
		
		//打开
		JMenuItem openMenuItem=new JMenuItem("打开");  	//创建打开项
		openMenuItem.setMnemonic('O');					//设置快捷键
		//选择打开触发打开窗口事件
		openMenuItem.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				openLocalPage();			//调用打开文件方法
			}
		});
		
		//关闭
		JMenuItem closeMenuItem=new  JMenuItem("关闭");	//创建关闭按钮
		closeMenuItem.setMnemonic('C'); 				//设置快捷键
		
		//设置关闭窗口的方法
		closeMenuItem.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				close();					//调用关闭按钮
			}
		});
		
		JMenuItem exitJMenuItem=new JMenuItem("退出");	//创建退出按钮
		exitJMenuItem.setMnemonic('E');					//设置快捷键
		
		//设置退出方法
		exitJMenuItem.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				exit();					//调用退出方法
			}
		});
		
		
		fileMenu.add(newMenuItem);						//将新建项添加到文件菜单下 
		fileMenu.add(openMenuItem);						//将打开项添加到文件菜单下
		fileMenu.add(closeMenuItem);					//将关闭项添加到文件菜单下
		
		JMenuBar menuBar=new JMenuBar();				//创建菜单栏
		menuBar.add(fileMenu);							//将文件菜单放入到菜单栏
		this.setJMenuBar(menuBar); 						//设置菜单栏到主窗口上
		
		
	}
	
	//初始化从工具栏
	private void initToolbar() {
		// TODO Auto-generated method stub
		back=new JButton("后退");							//创建后退按钮
		back.setEnabled(false);							//不可用
		//设置后退事件
		back.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				back();						//调用后退方法
			}
		});
		
		forward=new JButton("前进");						//创建前进按钮
		forward.setEnabled(false);						//不可用
		//设置前进事件
		forward.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				forward();					//调用前进方法
			}
		});
		
		JButton refreshButton=new JButton("刷新");
		//refreshButton.setMnemonic('F5');
		//刷新触发事件
		refreshButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				reload();				//调用重新加载方法
			}
		});
		
		
		JToolBar toolBar=new JToolBar();
		toolBar.add(back);
		toolBar.add(forward);
		toolBar.add(refreshButton);
		
		url=new JTextField(); 						//创建文本框
		//输入地址栏 回车事件
		url.addActionListener(new  ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				displayPage(url.getText());	//
			}
		});
		
		toolBar.add(new JLabel("\t\t地址:"));  //添加地址标签
		toolBar.add(url);
		
		this.getContentPane().add(toolBar,BorderLayout.NORTH);
		
		
	}
	private static void closeWindowWhenAllExit(boolean b) {
		// TODO Auto-generated method stub
		exit=b;
	}
	//设置主页
	public String getHome() {
		return home;
	}

	public void setHome(String home) {
		this.home = home;
	}

	//访问网址URL
	private boolean visitURL(URL source){
		try {
			System.out.println(source.toString());
			String href=source.toString();  		//获取网址
			Pane.setPage(source);					//设置待访问的URL
			this.setTitle(href);					//页面打开后 将浏览器的窗口的标题设置为URL
			url.setText(href);						//网址输入框的内容也设置为URL
			return true;
		} catch (Exception e) {
			messageLine.setText("不能打开页面:"+e.getMessage());
			return false;
		}
	}

	//打开URL指定的页面,URL放入历史列表中
	public void displayPage(URL url) {
		// TODO Auto-generated method stub
		if(visitURL(url)){   							//访问页面是否成功
			historyReport.add(url);						//URL放入历史表中
			int numentries=historyReport.size();
			if(numentries > maxHistory+10){
				historyReport=historyReport.subList(numentries-maxHistory, numentries);
				numentries=maxHistory;
			}
			current=numentries-1;
			if(current>0){								//不是当前页面
				back.setEnabled(true);					// 运行使用后退按钮
			}
		}
	}
	//浏览器打开指定页面
	public void displayPage(String href) {
		try {
			if(!href.startsWith("http://")){ 			//默认为HTTP协议
				href="http://"+href;
			}
			displayPage(new URL(href));
		} catch (Exception e) {
			messageLine.setText("错误网址:"+href);
		}
		
	}
	
	//打开本地文件
	protected void openLocalPage() {
		// TODO Auto-generated method stub
		if(fileChooser==null){
			fileChooser=new JFileChooser();   			//创建文件选择器
			FileFilter filter=new  FileFilter(){  		//文件过滤器 限制只接受 HTML和 HTM文件
				
				@Override
				public boolean accept(File pathname) {
					String fn=pathname.getName();
					if(fn.endsWith(".html") || fn.endsWith(".htm")){
						return true;
					}else {
						return false;
					}
				}

				@Override
				public String getDescription() {
					// TODO Auto-generated method stub
					return "HEML Files";
				}
			};
			
			fileChooser.setFileFilter(filter);
			fileChooser.addChoosableFileFilter(filter);
		}
		
		int result=fileChooser.showOpenDialog(this); 			//打开文件选择器 模式窗体
		
		if(result==JFileChooser.APPROVE_OPTION){				//选择确定按钮
			File selectedFile=fileChooser.getSelectedFile();
			try {
				displayPage(selectedFile.toURL());								
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

	//后退的方法
	protected void back() {
		// TODO Auto-generated method stub
		if(current>0){
			visitURL((URL)historyReport.get(--current));  	//访问前一页面
		}			
		back.setEnabled((current>0));						//当前下标>0 才可后退
		forward.setEnabled((current<historyReport.size()-1));
	}
	//前进的方法
	protected void forward() {
		// TODO Auto-generated method stub
		if(current<historyReport.size()-1){
			visitURL((URL)historyReport.get(current++));	//访问后一个页面
		}
		back.setEnabled((current>0));
		forward.setEnabled((current<historyReport.size()-1));
	}

	//重新加载页面
	protected void reload() {
		// TODO Auto-generated method stub
		if(current!=-1){  //显示空白页面
			Pane.setDocument(new javax.swing.text.html.HTMLDocument());
			visitURL((URL)historyReport.get(current));		//访问当前页面
		}
	}
	//显示主页方法
	public void home(){
		displayPage(getHome());
	}
	//关闭
	protected void close() {
		// TODO Auto-generated method stub
		this.setVisible(false);	//隐藏当前窗口,销毁窗口中的一些组件
		this.dispose();
		synchronized (TextWebBrowser.class) {
			TextWebBrowser.count--;
			if((count==0) && exit){
				System.exit(0);
			}
		}
	}

	//退出
	protected void exit() {
		// TODO Auto-generated method stub
		if(JOptionPane.showConfirmDialog(this, "你确定退出web浏览器?","退出",JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ //判断是否退出
			System.exit(0);
		}
	}
	//打开新的浏览器窗口
	protected void newBrower() {
		// TODO Auto-generated method stub
		TextWebBrowser b=new TextWebBrowser();
		b.setSize(this.getWidth(),this.getHeight()); 		//窗口与当前窗口一样大
		b.setVisible(true);
		
	}
	//处理超链接的事件
	@Override
	public void hyperlinkUpdate(HyperlinkEvent e) {
		// TODO Auto-generated method stub
		HyperlinkEvent.EventType type=e.getEventType(); 	//获取事件类型
		if(type==HyperlinkEvent.EventType.ACTIVATED){ 		//单击超链接事件
			displayPage(e.getURL());
		}else if(type==HyperlinkEvent.EventType.ENTERED){	//鼠标移动到超链接
			messageLine.setText(e.getURL().toString());
		}else if(type==HyperlinkEvent.EventType.EXITED){ 	//鼠标离开超链接
			messageLine.setText(" ");
		}
	}
	
	public static void main(String[]args){
		TextWebBrowser.closeWindowWhenAllExit(true);
		TextWebBrowser brower=new TextWebBrowser();
		brower.setSize(500,400);
		brower.setVisible(true); //显示窗口
		brower.displayPage(brower.getHome());
	}

	
	
}

你可能感兴趣的:(浏览器,swing)