基于Java的浏览器的设计与实现(含源文件)

问题描述:

1 基于Java 的浏览器的设计与实现

摘 要 本课程设计主要运用java 语言在Eclipse 编程环境下设计一个Web 浏览器,从而在Windows 98/2000/XP程序运行平台上来实现它的一些基本功能,本课程设计基本实现了预定目标。浏览器的设计包括了图形界面设计和底层设计,在整个设计过程中需要首先构建好图形界面,然后再编程来实现组件以完成相应的功能,浏览器图形界面作为系统和用户之间反馈信息的平台,起着尤为关键的作用。

1 引 言

当今世界是一个以计算机网络为核心的信息时代,互联网为人们快速获取、发布和传递信息提供了便捷,而浏览器作为互联网上查找信息的重要工具,给人们提供了巨大而又宝贵了信息财富,受到了大家的高度重视。网页浏览器是显示网页服务器或档案系统内的文件,并让用户与这些文件互动的一种软件。它用来显示在万维网或局域网内的文字、影像及其他资讯。浏览器作为重要的系统应用软件是不可或缺的。但目前,浏览器产品的市场被少数国外大公司垄断,众多的小型浏览器也尚处于发展期, 而国内的自主技术的浏览器更屈指可数,刚刚进入实用阶段。迫切需要更多的人来关注浏览器技术,开发中国自主知识产权的浏览器产品。

1.1 项目设计目的

此次课程设计的目的首先是让我们了解信息产业的多元性,把学到的知识运用到实际中,培养学生的综合模拟和实际操作能力,提高学生理论联系实际的能力,开拓创新;其次是掌握使用Eclipse 工具设计一个简单的Web 浏览器的方法,从而实现对资源的有效访问;掌握Java 语言编程,并可综合运用这些知识解决一定的实际问题,使我们在所学知识的综合运用能力上以及分析问题、解决问题能力上得到一定的提高;认识到团队精神的重要性,能够通过良好的分工合作来完成既定目标。

1.2 项目设计内容

2 (1)熟悉超文本传送协议(HTTP )进行通信;

(2)熟悉Eclipse 编程环境及Swing 、网络编程方法;

(3)理解B/S工作模式;

(4)实现简单的浏览器程序;

1.3 项目设计要求

(1)按要求编写课程设计报告书,能正确阐述设计结果。

(2)通过课程设计培养学生严谨的科学态度、认真的工作作风和团队协作精神。

(3)学会文献检索的基本方法和综合运用文献的能力。

(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。

2所用开发环境

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT )。

它主要由Eclipse 项目、Eclipse 工具项目和Eclipse 技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT 、CDT 和PDE.JDT 支持Java 开发、CDT 支持C 开发、PDE 用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE ,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。

Eclipse 是著名的跨平台的自由集成开发环境(IDE )。最初主要用于Java 语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python 的开发工具。Eclipse 的本身只是一个框架平台,但是众多插件的支持使得Eclipse 拥有其他功能相对固定的IDE 软件很难具有的灵活性。许多软件开发商以Eclipse 为框架开发自己的IDE 。[1]

2.2 JDK简介

JDK(Java Development Kit)是Sun Microsystems针对Java 开发员的产品。自从

3 Java 推出以来,JDK 已经成为使用最广泛的Java SDK(Software development kit)。

JDK 是整个Java 的核心,包括了Java 运行环境(Java Runtime Environment),Java 工具和Java 基础的类库(rt.jar)。不论什么Java 应用服务器实质都是内置了某个版本的JDK 。掌握 JDK 是学好Java 的第一步。最主流的JDK 是Sun 公司发布的JDK 。

JDK 包含的基本组件包括:

·javac – 编译器,将源程序转成字节码

·jar – 打包工具,将相关的类文件打包成一个文件

·javadoc – 文档生成器,从源码注释中提取文档

·jdb – debugger,查错工具

·java – 运行编译后的java 程序(.class 后缀的)

appletviewer :小程序浏览器,一种执行HTML 文件上的Java 小程序的Java 浏览器。

Javah :产生可以调用Java 过程的C 过程,或建立能被Java 程序调用的C 过程的头文件。

Javap :Java 反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

Jconsole: Java进行系统调试和监控的工具

3设计原理

3.1 JAVA语言简介

Java 是由Sun Microsystems公司于1995年5月推出的Java 程序设计语言(以下简称Java 语言)和Java 平台的总称。用Java 实现的HotJava 浏览器(支持Java applet )显示了Java 的魅力:跨平台、动态的Web 、Internet 计算。从此,Java 被广泛接受并推动了Web 的迅速发展,常用的浏览器现在均支持Java applet 。另一方面,Java 技术也不断更新。

4 Java 平台由Java 虚拟机(Java Virtual Machine )和Java 应用编程接口(Application Programming Interface、简称API )构成。Java 应用编程接口为Java 应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java 平台之后,Java 应用程序就可运行。现在Java 平台已经嵌入了几乎所有的操作系统。这样Java 程序可以只编译一次,就可以在各种系统中运行。Java 分为三个体系JavaSE(Java2 Platform Standard Edition,java 平台标准版) ,JavaEE(Java 2 Platform,Enterprise Edition ,java 平台企业版) ,JavaME(Java 2 Platform Micro Edition,java 平台微型版) 。

Java 主要特性:Java 语言是简单的、面向对象的、分布式的、健壮的、安全的、体系结构中立的、可移植的、解释型的、高性能的、多线程的、动态的。

3.2 图形用户界面(GUI )

图形用户界面(Graphical User Interface,简称 GUI ,又称图形用户接口)是指采用图形方式显示的计算机操作用户介面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。如Windows 是以图形界面方式操作的,因为你可以用鼠标来点击按钮来进行操作,很直观。

GUI 具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。GUI 由桌面、视窗、单一文件界面、多文件界面、标签、菜单、图标、按钮这几部分组成。[2]

3.3 Java Swing概述

Swing 是一个用于开发Java 应用程序用户界面的开发工具包,并以此为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing 开发人员只用很少的代码就可以利用Swing 丰富、灵活的功能和模块化组件来创建优雅的用户界面。

Swing 是建立在AWT 之上的,包括大多数轻量组件的组件集。除提供了AWT 所缺少的、大量的附加组件外,Swing 还提供了替代AWT 重量组件的轻量组件。Swing 还包括了一个使人印象深刻的、用于实现包含插入式界面样式等特性的图形用户界面的下层构件。因此,在不同的平台上,Swing 组件都能保持组件的界面样式特性,如双缓冲、调试图形和文本编辑包等。还具有以下特点:

(1)拥有一个丰富、便捷的用户界面元素集合。

5 (2)对底层平台依赖的很少,因此与平台相关的bug 很少。

(3)给予不同平台的用户一致的感官效果。

3.4抽象窗口工具箱(AWT )

AWT(Abstract Windowing Toolkit) ,中文译为抽象窗口工具包,是Java 提供的用来建立和设置Java 的图形用户界面的基本工具。AWT 由Java 中的java.awt 包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件(components)。

抽象窗口工具包 (Abstract Windowing Toolkit ) (AWT)是Java 的平台独立的窗口系统, 图形和用户界面器件工具包。AWT 是Java 基础类 (JFC)的一部分,为Java 程序提供图形用户界面(GUI)的标准API 。AWT 可用于Java 的applet 和applications 中。它支持图形用户界面编程的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。

3.5布局算法

本文中的布局应理解为界面输出前的预演和处理位置等信息的算法,而不是具体的画图和界面输出。布局算法的好坏直接关系到界面的输出效果,但布局算法也是要根据GUI 所能实现的输出效果来设计的,所以,GUI 往往成为系统的瓶颈,如果GUI 提供的支持有限,即使有再好的布局算法,也是纸上谈兵,无用武之地。在Swing 中有以下几种简单的布局管理器:

(1)FlowLayout 流式布局管理器

FlowLayout 是最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。

(2)BorderLayout 边界布局管理器

BorderLayout 为在容器中放置组件提供了一个稍微复杂的布局方案。BorderLayout 把容器分为五个区域:东、南、西、北和中。东占据容器的右侧,南占据容器的下侧,以此类推。

(3)GridLayout 网格布局管理器

GridLayout 将容器分割成许多列和行,组件被填充到每个网格中。添加到容

6 器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,直至占满该行的所有网格,接着继续在下一行中从左到右放置组件。

(4)CardLayout 卡片式布局管理器

CardLayout 将界面看作一系列的卡片,在任何时候只有其中一张卡片是可见的,这张卡片占据容器的整个区域。

当某个容器被创建后,就会有一个默认的布局管理器。Window 、Frame 和Dialog 的默认布局管理器是BorderLayout,Panel 和Applet 的默认布局管理器是FlowLayout 。可以调用容器的setLayout()方法来设置容器的布局管理器。

[3]

4 浏览器的设计

4.1功能需求的分析

我们所设计的浏览器功能比较简单,主要概括为以下几点:

(1) 界面:包括窗口,菜单,输入框,工具条,滚动条等的支持。

(2) 实现简单网页的布局,对简单网页的查看。

(3)具有超链接功能。

(4) 能够返回到主页面。

(5) 支持基本IO (Input/Output,输入/输出)。

(6)能够打开本地文件。

4.2设计步骤

我在整个团队中主要负责界面的设置,界面是一个直接反映信息交互的平台,起着举足轻重的作用,在这里我就怎样构建用户界面作为重点进行阐述。

1. 容器嵌套

选择好容器就是为界面构造一个基本的骨架,然后再在其中添加各个组件。在GUI 中可供选择的容器有Frame, Dialog, Applet, Panel,其中Panel 是可视容器,Frame 是顶级容器。我们要用Panel 和Frame 容器。继承顶级容器的方法、功能和参数,将菜单栏置于顶级容器;在次级容器contentpan 中加入了工具栏、状态栏、滚动条、编辑区域等,然后用边界布局管理器将所需的组件添加进来,具

7 体所需组件如下表所示:

表4-1 组件复用表

2. 组件定义

与其他编程语言类似,在JAVA 中也必须首先对变量以及所要用到的组件定义,确定其合法性,才能在后面的程序中被调用赋值。定义代码如下:

private Container contentPane; //变量内容窗格

private JTextField addressTex; //文本框

private JLabel statusLbl; //状态栏

用private 分别对滚动条、编辑显示区域、菜单栏、文件选择框、按钮等进行定义。

3. 组件初始化、添加和监听

mb=new JMenuBar(); // 初始化菜单栏

m1=new JMenu("File"); // 初始化菜单

m2=new JMenu("Edit");

m3=new JMenu("View");

mb.add(m1); // 将菜单加入菜单栏

mb.add(m2);

mb.add(m3);

8 //对File 菜单各个菜单项初始化

mi1=new JMenuItem("Open File");

mi2=new JMenuItem("Close");

mi3=new JMenuItem("Quit");

Edit 、View 菜单的各个菜单项进行初始化过程与之类似

//对File 菜单各个菜单项进行监听

mi1.addActionListener(new OpenFileActionListener());

mi2.addActionListener(new QuitActionListener());

mi3.addActionListener(new QuitActionListener());

4.设置布局

pp.setBackground(Color.pink); // 设置颜色

pp.setLayout(new FlowLayout()); // 流式布局管理器,对组件由左至右布局 pp.add(btn2); //对按钮UNDO 布局

pp.add(addressTex); //对地址栏布局

pp.add(btn1); //对按钮GOTO 布局

contentPane.add(pp,BorderLayout.NORTH); //将工具栏放置在界面的北方 contentPane.add(statusLbl,BorderLayout.SOUTH);

//状态栏布置在界面的南边 centerPane = new JScrollPane(); // 浏览器体部布置在界面中央

JViewport view = centerPane.getViewport(); // 显示区域

textArea = new JEditorPane();

// 内容显示

5. 按钮功能的实现

每个按钮需要对应到相应的功能。我们设计的浏览器只有UNDO 和GOTO 两个按钮。UNDO 对应浏览页面的后退浏览,实现这个功能是在监听到用户点击此按钮时后退到上一浏览页面。而GOTO 就是当系统监听到地址栏有地址写入时,浏览器先判断这个地址长度是否大于零并且此地址是不是以HTTP 开头,如果是,则浏览器主动链接到目的地址;若判断出这个地址长度大于零并且此地址不是以HTTP 开头,则在地址前面自动加上HTTP ,找到目的地址。

9 5 浏览器的实现

5.1 GOTO 按钮功能测试

在程序中地址栏默认网址为“http://www.baidu.com/”,点击Goto 按钮,进入百度主页,如图5.1所示:

图5.1点击Goto 进入百度主页截图

5.2测试菜单栏选项

在地址栏中输入“http://www.google.com/”, 可以进入Google 主页,依次点开File 、Edit 、View 菜单测试器有效性,如下图所示:

图5.2主菜单File 的子菜单实现图

10 图5.3 主菜单Edit 的子菜单实现图

图5.4主菜单View 的子菜单实现图

点击打开File 菜单中的open file按钮时,则打开本地文件。如图5.5所示

:

图5.5 主菜单File 中OpenFile 的实现

5.3超链接的实现

在百度主页中点击“更多”,可直接链接到下一显示页面,证明浏览器实现了链接功能,再点击“Undo ”按钮,页面又可返回到百度主页。超链接的实现如图5.6所示:

11

图5.6 超链接的实现图

经过以上几个步骤的测试,图形界面的设计能够与底层设计达到完美契合,因此我们团队所设计的浏览器实现了预定功能,基本达到了此次课程设计的要求,浏览器设计成功。

6 结束语

这次课程设计历时两个星期,在这两个星期的学习中,我初步掌握了有关JAVA 的基础知识,能够理解较为简单的JAVA 程序,基本实现课程设计的要求。我认为这次课程设计最大的收获是深刻地认识到了团队合作的重要性。

在以往的课内学习中,我个人懂得了较多的理论知识,同时也进行了上机实践加强自己对理论的理解并提升了实际操作能力。而本次课程设计相对于实验又有了质的飞跃,我们通过最初的特色组队、确立团队目标,然后缜密构思、分工合作,最终实现了我们设计的浏览器的基本功能。这一路做过来,我们多次请教了老师,翻阅了有关参考书,最重要的是进行了团队激烈的讨论,遇到问题再解决问题然后再发现问题再解决的思想火花的碰撞??在这一过程的循环往复中我深深地体验到了思考和学习的乐趣。在享受这一过程中,我不仅学到了新的知识,我的思维也更加开阔、更加灵活、更加全面了。

短短的几星期中,我有过失败的沮丧,也有过成功的欣喜。在一次次的挫折和失败中我不断寻找真理,寻找解决问题的最佳途径,更加深刻地体会到了“失

12 败乃成功之母”的含义,惰性和轻易放弃成了我最大的敌人,很庆幸,我战胜了它们,其实是战胜了自己,最终赢得了硕果。如同需要浇灌才能长成的硕果一样,我的最终成果也是用辛勤汗水培育而来的,当然也离不开老师的耐心指导和同学的无私帮助。在这里我也要对敬爱的老师和同学们的深切关怀表示衷心的感谢!

对我而言,知识上的收获固然重要,精神上的丰收更加可贵。面对生活其实也是相同的道理,不抛弃不放弃是成功的前提。人生是在不断地攀登中提升的,山的绵延组成了曲折的人生,当我们经历过风雨最终爬到顶峰看到美轮美奂的日出时,一切艰难都显得苍白无力。挫折是一份财富,经历是一份拥有。感谢大家让我拥有这份最珍贵的财富!

13 参考文献

[1] 2004马俊 范玫 . JAVA 语言面向对象程序设计. 机械工业出版社. 2009年

[2]于万波. Java 语言实用教程. 清华大学出版社. 2008年

[3]刘亚滨. 精通Eclipse. 北京:电子工业出版社.2004

14 附录1:Web 服务器设计与实现源程序清单 % 程序功能::Web 服务器设计与实现 % 程序作者:陈璐

% 最后修改日期:2009-07-03

package com.briup.browser;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Container;

import java.awt.FileDialog;

import java.awt.FlowLayout;

import java.awt.Frame;

import java.awt.Panel;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.FilenameFilter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException; import java.net.URL;

import java.util.ArrayList;

import java.util.Date;

import java.util.Iterator;

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.JPanel;

import javax.swing.JProgressBar;

import javax.swing.JScrollPane;

15 import javax.swing.JTextField;

import javax.swing.JTree;

import javax.swing.JViewport;

import javax.swing.event.HyperlinkEvent;

import javax.swing.event.HyperlinkListener;

import javax.swing.text.html.HTMLDocument;

import javax.swing.text.html.HTMLFrameHyperlinkEvent; import javax.swing.tree.DefaultMutableTreeNode; import com.briup.browser.Browser;

public class Browser extends JFrame{

private Container contentPane;

private JTextField addressTex;//文本框

private JLabel statusLbl;

private JScrollPane centerPane;//初始化滚动条 private JEditorPane textArea;//编辑显示区域 private JMenuBar mb;

// 文件选择框

private JFileChooser chooser1=new JFileChooser(); private JButton btn1,btn2,btn3;

private ArrayList<String> list;

private JMenu m1,m2,m3;

// 菜单项

private JMenuItem

mi1,mi2,mi3,mi4,mi5,mi6;

public Browser(String title){

super(title);

setBounds(120,80, 750, 500);

setDefaultCloseOperation(

this.EXIT_ON_CLOSE);

contentPane = this.getContentPane(); initGUI();

// 初始化菜单栏

mb=new JMenuBar();

// 初始化菜单

m1=new JMenu("File");

m2=new JMenu("Edit");

m3=new JMenu("View");

// 将菜单加入菜单栏

mb.add(m1);

mb.add(m2);

mb.add(m3);

setJMenuBar(mb);

// 对File 菜单各个菜单项初始化 // 初始化菜单项

16 mi1=new JMenuItem("Open File");

mi1.addActionListener(new OpenFileActionListener()); mi2=new JMenuItem("Close");

mi2.addActionListener(new QuitActionListener()); mi3=new JMenuItem("Quit");

mi3.addActionListener(new QuitActionListener());

// 对Edit 菜单的各个菜单项进行初始化

mi4=new JMenuItem("Cut");

mi5=new JMenuItem("Copy");

// 对View 菜单的各个菜单项进行初始化, 并添加监听 mi6=new JMenuItem("State Bar");

// 将菜单项加入到file 菜单

m1.add(mi1);

m1.add(mi2);

m1.add(mi3);

// 将菜单项加入到Edit 菜单

m2.add(mi4);

m2.add(mi5);

//

将菜单项加入到view 菜单

m3.add(mi6);

}

private void initGUI() {

contentPane.setLayout(new BorderLayout());

// 地址栏

addressTex = new JTextField(40);

addressTex.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

String address =

addressTex.getText().trim();

try{

if(addressTex.getText().length()>0&&

addressTex.getText().startsWith("http://"))

textArea.setPage(address);

else if(addressTex.getText().length()>0&&

!addressTex.getText().startsWith("http://"))

{String newURL="";

newURL="http://"+addressTex.getText();// 加http:

17 URL newurl=new URL(newURL); addressTex.setText(newURL); textArea.setPage(newurl); }} catch (IOException e1) { e1.printStackTrace(); }

}

});

btn1 = new JButton("Goto");

btn1.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

String address =

addressTex.getText().trim();

try{

if(addressTex.getText().length()>0&&

addressTex.getText().startsWith("http://"))

textArea.setPage(address);

else if(addressTex.getText().length()>0&&

!addressTex.getText().startsWith("http://"))

{String newURL="";

newURL="http://"+addressTex.getText();// 加http:

URL newurl=new URL(newURL);

addressTex.setText(newURL);

textArea.setPage(newurl);

}} catch (IOException e1) {

e1.printStackTrace();

}

}

});

btn2 = new JButton("Undo");

btn2.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {

String address =

addressTex.getText().trim();

try{

if(addressTex.getText().length()>0&& addressTex.getText().startsWith("http://"))

18 textArea.setPage(address);

else if(addressTex.getText().length()>0&&

!addressTex.getText().startsWith("http://")) {String newURL="";

newURL="http://"+addressTex.getText();// 加http:

URL newurl=new URL(newURL);

textArea.setPage(newURL);

}} catch (IOException e1) {

e1.printStackTrace();

}

}

});

JPanel pp = new JPanel();

// 设置颜色

pp.setBackground(Color.pink);

pp.setLayout(new FlowLayout());

pp.add(btn2);

pp.add(addressTex);

pp.add(btn1);

contentPane.add(pp,BorderLayout.NORTH);

//状态栏

statusLbl = new JLabel("status: ");

contentPane.add(statusLbl,BorderLayout.SOUTH);

// 浏览器体部

centerPane = new JScrollPane();

// 显示区域

JViewport view = centerPane.getViewport();

// 内容显示

textArea = new JEditorPane();

// 监听超链接, 使其生效

textArea.addHyperlinkListener

(new HyperlinkListener(){

public void hyperlinkUpdate(HyperlinkEvent e) {

if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { JEditorPane pane = (JEditorPane) e.getSource(); if (e instanceof HTMLFrameHyperlinkEvent) {

HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent)e;

HTMLDocument doc

= (HTMLDocument)pane.getDocument();

19

doc.processHTMLFrameHyperlinkEvent(evt);

} else {

try {

pane.setPage(e.getURL());

} catch (Throwable t) {

t.printStackTrace();

}

}

}

}

});

addressTex.setText("http://www.baidu.com/");

// 设置不可写操作

textArea.setEditable(false);

view.add(textArea);

contentPane.add(centerPane); }

// 撤销按钮

class UndoActionListener implements ActionListener{ public void actionPerformed(ActionEvent e) { btn2.setEnabled(true);

int index=list.indexOf(addressTex.getText()); if(index-1>=0){

String preURL=(String)list.get(index-1); addressTex.setText(preURL); if((list.indexOf(preURL))==0){ btn1.setEnabled(false);

}

try {

URL url=new URL(preURL); textArea.setPage(url);

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

// 选择打开文件

class MyFilenameChooser implements FilenameFilter{ public boolean accept(File dir,String name){ return name.endsWith("html");

20 }

}

// 打开文件

public void openFile(String fileName){

try {

URL url=new URL("file"+":///"+fileName); addressTex.setText(url.toString());

} catch (Exception e1) {

JOptionPane.showMessageDialog

(null,"打开失败!"," ?openopen 打开文件",JOptionPane.ERROR_MESSAGE);

}

}

// 打开文件

class OpenFileActionListener implements ActionListener{ public void actionPerformed(ActionEvent e) { FileDialog fd=new FileDialog(new Frame(), "Open a file",FileDialog.LOAD);

FilenameFilter ff=new MyFilenameChooser(); fd.setVisible(true);

String name=fd.getFile();

openFile(fd.getDirectory()+name); }

}

public boolean filter(String strURL){

FileReader fr=null;

BufferedReader br=null;

boolean flag=true;

try {

br=new BufferedReader(fr);

String temp=null;

while((temp=br.readLine())!=null){

if(temp.equals(strURL))

flag=false;

else

flag=true;

}

return flag;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

21 // 停止按钮

class QuitActionListener implements ActionListener{ public void actionPerformed(ActionEvent e) { System.exit(0);

}

}

public void go(){

this.setVisible(true);

}

public static void main(String[] args){

new Browser("web 浏览器").go();

}

}

1个回答 分类:综合 2018-01-23

问题解答:

我来补答
 
 
展开全文阅读
剩余:2000