`
Luob.
  • 浏览: 1588744 次
  • 来自: 上海
社区版块
存档分类
最新评论

自制简单浏览器

阅读更多
使用 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());
	}

	
	
}
1
1
分享到:
评论
2 楼 wwwcomy 2013-03-13  
讲讲 JEditorPane.setPage(URL page) 的实现原理就好了~
1 楼 ray_linn 2013-03-12  
浏览器的壳而已。

相关推荐

    基于PyQt的自制简易浏览器(Python).zip

    【基于PyQt的自制简易浏览器】是一个Python编程项目,它利用了PyQt这一强大的图形用户界面库来构建一个简易的Web浏览器。PyQt是Python语言中的一个模块,它提供了对Qt库的接口,Qt库是C++开发的,广泛用于创建跨平台...

    java简易自制浏览器

    java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器

    C#编写的自制浏览器

    本项目将探讨如何利用C#来开发一个简单的浏览器,这将涉及网络编程、UI设计和多线程等多个方面的知识。 首先,要理解浏览器的基本结构。一个浏览器通常包括以下几个关键组件: 1. **用户界面(UI)**:这是用户与...

    一个简易的浏览器app

    下面将详细解释如何使用Webview构建一个简单的浏览器应用,以及相关的自定义功能。 1. **Webview基本使用** Webview是Android SDK中的一个关键组件,位于`android.webkit`包下。在XML布局文件中,你可以通过添加`...

    VC模拟自制网页浏览器

    【VC模拟自制网页浏览器】项目是一个适合初学者的实践项目,它使用了单文档界面(SDI)技术来实现一个简单的HTML浏览器。这个项目的核心是理解如何在Visual C++(VC)环境中创建一个应用程序,该程序能够加载和显示...

    C# winform利用cefsharp组件 自制简易Chrome内核浏览器

    标题中的“自制简易Chrome内核浏览器”意味着我们的目标是创建一个轻量级的浏览器,其核心是Chrome的开源渲染引擎。这样的浏览器可能不包含所有标准浏览器的复杂功能,如收藏夹和历史记录,但可以通过代码扩展来添加...

    史上最简单的 java 自制浏览器(源码)

    在本项目中,我们探索的是一个使用Java编程语言自制的简易浏览器。这个浏览器的源代码设计得非常简洁,旨在帮助初学者理解Java编程基础以及如何利用特定库来创建一款基本的浏览器应用。以下是对这个项目及其相关知识...

    自制图片浏览器

    【自制图片浏览器】是一款独特的软件应用,旨在提供用户一个便捷且功能丰富的图片浏览体验,同时集成了文件管理功能。这款图片浏览器的开发旨在满足用户对于高效管理和欣赏个人图片库的需求,使得图片查看与组织变得...

    自制Internet网页浏览器 小例子,C++.net源代码编写

    标题中的“自制Internet网页浏览器 小例子,C++.net源代码编写”意味着我们将探讨一个使用C++编程语言和.NET框架创建简易网页浏览器的过程。这个项目可能是为了教学目的,帮助初学者理解网络浏览器的基本工作原理...

    自制浏览器

    【自制浏览器】是一款基于Java语言实现的用户界面型浏览器,具备基本的浏览网页以及历史记录管理功能。这个项目主要利用了SWT(Standard Widget Toolkit)库来构建图形用户界面,SWT是Java平台上的一种轻量级GUI库,...

    一个易语言自制浏览器的基本代码

    这是本人自制的最简单的浏览器,基于易语言的易浏览器开发。

    用vb.net自制Web浏览器

    【标题】:用VB.NET自制Web浏览器 在编程领域,创建一个自定义的Web浏览器是一项有趣且富有挑战性的任务,特别是在VB.NET环境下。VB.NET是Microsoft .NET框架的一部分,提供了一个强大而直观的编程环境,适合开发...

    用visual basic自制的浏览器

    标题中的“用Visual Basic自制的浏览器”意味着这个项目是一个使用Visual Basic编程语言开发的自定义浏览器。Visual Basic是Microsoft公司推出的一种面向对象的可视化编程工具,尤其适合初学者和快速原型开发。它...

    java 自制浏览器

    它可能展示了一个简单的浏览器界面,包括地址栏、前进/后退按钮、书签菜单等。 解析HTML和CSS是浏览器的核心功能之一。在Java中,可以使用第三方库如Jsoup来解析HTML,提取文档结构和内容。对于CSS,Java没有内置的...

    Delphi自制小浏览器

    Delphi提供了一些工具,如Inno Setup,可以帮助创建简单的安装程序,包含所有必要的依赖项和配置文件,使得用户可以轻松地在他们的计算机上安装和运行这个小浏览器。 总的来说,“Delphi自制小浏览器”项目涵盖了...

    自制小小浏览器

    【自制小小浏览器】是一款基于Delphi编程环境开发的简易浏览器应用。这个项目旨在提供一个学习和实践 Delphi 编程及浏览器开发的基础平台。通过分析和理解源代码,开发者可以深入掌握 Delphi 的组件使用、事件处理...

    自制简易的网络浏览器

    用vb做的浏览器,简易得很.但是可以把玩,也可添加 些许功能

    MFC自制精简浏览器源代码,VC++源代码

    【MFC自制精简浏览器源代码,VC++源代码】是一个非常适合VC++初学者和MFC框架学习者的研究项目。MFC(Microsoft Foundation Classes)是微软提供的一个C++类库,用于构建Windows应用程序,它封装了Windows API,使得...

    vc简易浏览器

    【VC简易浏览器】是一款利用Microsoft Visual C++ 6.0集成开发环境(IDE)和MFC(Microsoft Foundation Classes)库构建的简单Web浏览器。这款浏览器是面向初学者设计的,旨在帮助他们理解如何在Windows环境下使用...

Global site tag (gtag.js) - Google Analytics