自制简单浏览器

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


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



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值