`
JavaSam
  • 浏览: 952147 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

纯JAVA 浏览器 学习用

    博客分类:
  • JAVA
 
阅读更多

 

package com.file;

import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.filechooser.FileFilter;

public class WebBrowser extends JFrame implements HyperlinkListener,
		PropertyChangeListener {// 实现Web浏览器,支持HTML页面的显示
	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 WebBrowser() {// 默认构造方法
		super("TextWebBrowser");
		Pane = new JEditorPane(); // 新键面板
		Pane.setEditable(false); // 不可编辑
		Pane.addHyperlinkListener(this); // 注册事件处理器,用于超连接事件。
		Pane.addPropertyChangeListener(this);// 用于处理属性改变事件
		this.getContentPane().add(new JScrollPane(Pane),// 将面板放入主窗口中
				BorderLayout.CENTER);// 面板居中
		messageLine = new JLabel(" ");// 创建状态栏
		this.getContentPane().add(messageLine, BorderLayout.SOUTH);
		this.initMenu();// 调用方法初始化菜单
		this.initToolbar();// 调用方法初始化工具栏
		WebBrowser.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() {// 选择新建触发打开窗口事件
					public void actionPerformed(ActionEvent e) {
						newBrowser();// 调用打开新的窗口方法
					}
				});
		JMenuItem openMenuItem = new JMenuItem("打开");// 创建打开项
		openMenuItem.setMnemonic('O');// 设置快捷键
		openMenuItem.addActionListener(new ActionListener() {// 选择打开触发打开窗口事件
					public void actionPerformed(ActionEvent e) {
						openLocalPage();// 调用打开文件方法
					}
				});
		JMenuItem closeMenuItem = new JMenuItem("关闭");// 创建关闭项
		closeMenuItem.setMnemonic('C');// 设置快捷键
		closeMenuItem.addActionListener(new ActionListener() {// 选择关闭触发打开窗口事件
					public void actionPerformed(ActionEvent e) {
						close();// 调用关闭窗口方法
					}
				});
		JMenuItem exitMenuItem = new JMenuItem("退出");// 创建退出项
		exitMenuItem.setMnemonic('E');// 设置快捷键
		exitMenuItem.addActionListener(new ActionListener() {// 选择退出触发打开窗口事件
					public void actionPerformed(ActionEvent e) {
						exit();// 调用退出方法
					}
				});
		fileMenu.add(newMenuItem);// 将新建项添加到文件菜单下
		fileMenu.add(openMenuItem);// 将打开项添加到文件菜单下
		fileMenu.add(closeMenuItem);// 将关闭项添加到文件菜单下
		fileMenu.add(exitMenuItem);// 将退出项添加到文件菜单下
		JMenuBar menuBar = new JMenuBar();// 创建菜单栏
		menuBar.add(fileMenu);// 将文件菜单放入菜单栏
		this.setJMenuBar(menuBar);// 设置菜单栏到主窗口
	}

	private void initToolbar() {// 初始化工具栏
		back = new JButton("后退");// 创建后退按钮
		back.setEnabled(false);// 不可用
		back.addActionListener(new ActionListener() {// 选择后退触发后退事件
			public void actionPerformed(ActionEvent e) {
				back();// 调用后退方法
			}
		});
		forward = new JButton("前进");// 创建前进按钮
		forward.setEnabled(false);// 不可用
		forward.addActionListener(new ActionListener() {// 选择前进触发前进事件
			public void actionPerformed(ActionEvent e) {
				forward();// 调用前进方法
			}
		});
		JButton refreshButton = new JButton("刷新");// 创建刷新按钮
		refreshButton.addActionListener(new ActionListener() {// 选择刷新触发刷新事件
					public void actionPerformed(ActionEvent e) {
						reload();// 调用刷新方法
					}
				});
		JToolBar toolbar = new JToolBar();// 创建工具栏
		toolbar.add(back);// 将后退按钮添加到工具栏
		toolbar.add(forward);// 将前进按钮添加到工具栏
		toolbar.add(refreshButton);// 将刷新按钮添加到工具栏
		url = new JTextField();// 创建文本框
		url.addActionListener(new ActionListener() {// 输入地址回车触发事件
			public void actionPerformed(ActionEvent e) {
				displayPage(url.getText());
			}
		});
		toolbar.add(new JLabel("         地址:"));// 添加地址标签
		toolbar.add(url);// 将文本框添加到工具栏
		this.getContentPane().add(toolbar, BorderLayout.NORTH);// 将工具栏放在主窗口的南部
	}

	public static void closeWindowWhenAllExit(boolean b) {// 当所有窗口关闭时浏览器退出
		exit = b;
	}

	public void setHome(String home) {// 设置主页
		this.home = home;
	}

	public String getHome() {
		return home;
	}

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

	public void displayPage(URL url) {// 打开URL指定的页面,URL放入历史列表中
		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 (MalformedURLException ex) {
			messageLine.setText("错误的网址: " + href);
		}
	}

	public void openLocalPage() {// 打开本地文件
		if (fileChooser == null) {
			fileChooser = new JFileChooser();// 创建文件选择器
			FileFilter filter = new FileFilter() {// 文件过滤器限制只接受HTML和HTM文件
				public boolean accept(File f) {
					String fn = f.getName();
					if (fn.endsWith(".html") || fn.endsWith(".htm")) {
						return true;
					} else {
						return false;
					}
				}

				public String getDescription() {
					return "HTML Files";
				}
			};
			fileChooser.setFileFilter(filter);
			fileChooser.addChoosableFileFilter(filter);// 只允许选择HTML和HTM文件
		}
		int result = fileChooser.showOpenDialog(this);// 打开文件选择器
		if (result == JFileChooser.APPROVE_OPTION) {// 选择确定按钮
			File selectedFile = fileChooser.getSelectedFile();// 获得选择的文件
			try {
				displayPage(selectedFile.toURL());
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
		}
	}

	public void back() {// 后退方法
		if (current > 0) {
			visitURL((URL) historyReport.get(--current));// 访问前一页
		}
		back.setEnabled((current > 0));// 当前页下标>0,可后退
		forward.setEnabled((current < historyReport.size() - 1));// 下标不是最后一页允许前进
	}

	public void forward() {// 前进方法
		if (current < historyReport.size() - 1) {
			visitURL((URL) historyReport.get(++current));
		}
		back.setEnabled((current > 0));// 当前页面下标>0,可后退
		forward.setEnabled((current < historyReport.size() - 1));// 当前页面下标不是最后,可前进
	}

	public void reload() {// 重新加载页面
		if (current != -1) {
			Pane.setDocument(new javax.swing.text.html.HTMLDocument());// 显示空白页
			visitURL((URL) historyReport.get(current));// 访问当前页
		}
	}

	public void home() {// 显示主页方法
		displayPage(getHome());
	}

	public void newBrowser() {// 打开新的浏览器窗口
		WebBrowser b = new WebBrowser();
		b.setSize(this.getWidth(), this.getHeight());// 窗口与当前窗口一样大
		b.setVisible(true);
	}

	public void close() {// 关闭当前窗口
		this.setVisible(false);// 隐藏当前窗口,销毁窗口中的组件
		this.dispose();
		synchronized (WebBrowser.class) {
			WebBrowser.count--;
			if ((count == 0) && exit) {
				System.exit(0);
			}
		}
	}

	public void exit() {// 退出窗口程序
		if ((JOptionPane.showConfirmDialog(this, "你确定退出Web浏览器?", "退出",
				JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) {// 判断是否退出
			System.exit(0);
		}
	}

	public void hyperlinkUpdate(HyperlinkEvent e) {// 处理超链接事件
		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 void propertyChange(PropertyChangeEvent e) {// 处理属性改变事件

	}

	public static void main(String[] args) throws IOException {// java程序主入口处
		WebBrowser.closeWindowWhenAllExit(true);// 设置浏览器,当所有浏览器窗口都被关闭时,退出应用程序
		WebBrowser browser = new WebBrowser(); // 创建一个浏览器窗口
		browser.setSize(500, 400); // 设置浏览器窗口的默认大小
		browser.setVisible(true); // 显示窗口
		browser.displayPage(browser.getHome()); // 打开主页
	}
}
分享到:
评论

相关推荐

    纯java浏览器源码

    【纯Java浏览器源码解析】 在Java编程领域,创建一个基于Java的浏览器是一个挑战性的项目,它可以深化对JavaSE(标准版)的理解,尤其是Swing库的使用,用于构建图形用户界面(GUI)。这个“纯Java浏览器”项目,...

    java浏览器课程设计

    Java浏览器课程设计是一门深入探讨如何使用Java编程语言构建一个功能完备的Web浏览器的实践性课程。这个项目旨在让学生理解网络通信的基本原理,掌握Java GUI(图形用户界面)设计,并了解浏览器背后的复杂工作流程...

    jBrowserDriver是一个纯Java编写的可编程嵌入式的浏览器驱动基于WebKit

    作为一个纯Java实现的浏览器驱动,jBrowserDriver完全摒弃了传统的图形用户界面,转而依赖于WebKit渲染引擎来解析和执行网页。这使得它在不需要实际显示浏览器窗口的情况下进行自动化测试和网页操作,尤其适用于...

    用java写的简单的web浏览器

    【标题】"用Java写的简单的Web浏览器"是一个基于Java编程语言开发的轻量级网络浏览应用,它旨在提供基础的网页浏览功能。这样的项目对于学习Java编程和理解Web交互原理的初学者来说,是一个很好的实践案例。 【描述...

    运用java实现简单的浏览器功能

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个简单的浏览器功能。Java以其跨平台性和丰富的类库,成为开发这种应用的理想选择。NETBEANS是一个流行的集成开发环境(IDE),它提供了用户友好的界面和强大...

    纯java做的j2ee项目

    【纯Java实现的J2EE项目详解】 在Java开发领域,J2EE(Java 2...这个“纯Java做的J2EE项目”不仅是一个学习的实例,也是一个实践平台,通过它,你可以掌握J2EE开发的基本流程和核心技术,为将来的工作打下坚实的基础。

    纯Java实现整个网页截图项目源代码

    在本项目中,"纯Java实现整个网页截图项目源代码" 是一个利用Java编程语言来实现的实用程序,它能够捕获整个网页的图像并将其保存为图片文件。这个项目的核心在于利用DJNativeSwing组件,这是一个开源的Java库,它...

    Java学习入门资料 PPT版本

    ### Java学习入门资料知识点梳理 #### 一、Java语言历史与发展 - **起源与早期发展** - **前身**:Oak(1990年),由James Gosling等人在Sun Microsystems开发。 - **Green项目**:Sun Microsystems于1990年开始...

    纯java实现的OAuth2流程

    在这个"纯Java实现的OAuth2流程"中,我们将深入探讨如何不依赖Spring Boot来独立构建OAuth2的客户端和服务端。 首先,我们要理解OAuth2的基本流程,它通常包括四个角色:资源所有者(Resource Owner)、资源服务器...

    纯Java编写的拼图游戏

    【纯Java编写的拼图游戏】是一款基于Java技术开发的娱乐应用,它为用户提供了在计算机上或网页中体验拼图游戏的平台。这款游戏利用了Java的跨平台特性,可以在不同的操作系统上运行,同时通过Web技术,使得玩家也能...

    基于鸿蒙HarmonyOS,使用ArkTS开发纯净的浏览器(小狐狸浏览器).zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

    JAVA源码学习下载

    在JAVA源码学习下载这个主题中,我们主要探讨两个项目:一个简单的文本编辑器程序和一个具有简单计算功能的计算器applet程序。这两个项目都是在DOS环境下运行的,这表明我们将回到编程的基础,理解如何在命令行界面...

    双内核web浏览器

    总的来说,这个项目为Java开发者提供了一个实践机会,通过学习和使用jdic JEditorPane,他们可以深入理解Java GUI编程,特别是如何在Java应用程序中嵌入复杂的Web浏览功能。同时,这也是一种探究双内核浏览器工作...

    Java swing实现简单的浏览器源码免费分享.zip

    通过这个项目,开发者可以学习到如何利用Java Swing构建用户界面,处理网络请求,以及实现基本的浏览器功能。同时,这也是一个很好的练习,有助于理解Java多线程、网络编程以及GUI设计的基础知识。

    java 基础入门学习教程

    - **面向对象**:Java是一种纯面向对象的语言,支持封装、继承和多态等特性。 - **平台独立性**:通过Java虚拟机(JVM),Java程序可以跨平台运行。 - **安全性**:Java内置了安全机制,例如沙箱模型,能够防止恶意...

    纯Java的一个邮件服务器

    本项目是基于纯Java实现的一个邮件服务器,名为James,版本为2.3.1。James是一个开源项目,它提供了一个全面的邮件服务器解决方案,适用于小型到大型的企业环境。 **JavaMail API** JavaMail API是Java平台上的一...

    纯java编写_Swing_AWT

    本教程将深入探讨如何使用纯Java编写Swing和AWT应用,帮助你掌握这两者的核心概念和用法。 Swing是Java Foundation Classes (JFC) 的一部分,它提供了丰富的用户界面组件,如按钮、文本框、菜单等,用于构建美观且...

    Java学习入门资料

    - **浏览器支持**: Hotjava 是第一个支持 Java 的浏览器。随后 Netscape 2.0 也加入了支持。 - **早期版本发展**: - 1995 年 5 月 23 日发布 Java 1.0.2 API。 - 1997 年 2 月 18 日发布 JDK 1.1 (Java 1.1 API)。...

    java Servlet学习笔记

    Java Servlet是Java编程语言中用于处理Web服务器与客户端交互的一种技术,主要应用于构建动态Web应用程序。Servlet是Java EE(企业版)的一部分,它允许开发者在服务器端创建强大的、可扩展的网络应用程序。以下是对...

Global site tag (gtag.js) - Google Analytics