一个简单的java浏览器

 

========= HWebBrowser.java ========= 

 import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseListener;
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileView;
import java.io.*;
import java.net.*;
import java.util.*;

/**
*@author B.Y HuanG
*/
public class HWebBrowser extends JFrame implements HyperlinkListener,ActionListener{
 
 //界面基本控件
 private Toolkit tkDf; //默认工具包
 private JToolBar tbrMain; //工具栏
 private JLabel lblURL; //地址栏标签
 private JButton btnGO; //URL跳转按钮
 private JTextField txtURL; //地址栏
 private JEditorPane etpWeb; //网页框
 private JScrollPane srpWeb; //滚动条
 private JFileChooser fc; //文件选择器
 
 //菜单栏
 private JMenuBar mbrMain; //菜单栏
 
 private JMenu fileMenu; //文件菜单组
 private JMenuItem saveAsItem; //另存为
 private JMenuItem exitItem; //退出
  
 private JMenu bookmarkMenu; //标签菜单组
 private JMenuItem saveBMItem;//保存标签
 
 private JMenu editMenu; //编辑菜单组
 private JMenuItem backItem; //退后
 private JMenuItem forwardItem; //前进
 
 private JMenu viewMenu; //视图菜单组
 private JMenuItem fullscreenItem; //全屏视图
 private JMenuItem sourceItem; //源码视图
 private JMenuItem reloadItem; //重载
 
 //工具栏
 private JButton btnSaveAs; //另存为按钮
 private JButton btnBack; //退后按钮
 private JButton btnForward;//前进按钮
 private JButton btnSource;//源码视图按钮
 private JButton btnExit; //退出按钮
 
 //创建一个从左到右显示其组件
 private Box bxs;
 
 //声明一个List用于存放访问过的URL
 private ArrayList htys = new ArrayList();
 private int htysIndex;
 
 
 
 /**
 *初始化界面控件
 *并配置控件   */
 public void init(){
  //获取默认工具包
  tkDf = Toolkit.getDefaultToolkit();
  
  //基本控件
  tbrMain = new JToolBar();

  lblURL = new JLabel("地址:");
  btnGO  = new JButton("转到");
  txtURL = new JTextField();
  etpWeb = new JEditorPane();
  etpWeb.setEditable(false);
  srpWeb = new JScrollPane(etpWeb);
  fc = new JFileChooser();
  
  //菜单栏
  mbrMain = new JMenuBar();
  
  fileMenu = new JMenu("文件(F)");
  saveAsItem = new JMenuItem("另存为(S)");
  exitItem = new JMenuItem("退出(E)");
  
  bookmarkMenu = new JMenu("标签(B)");
  saveBMItem = new JMenuItem("保存标签(K)");
  
  editMenu = new JMenu("编辑(E)");
  backItem = new JMenuItem("退后(Z)");
  forwardItem = new JMenuItem("前进(A)");
  
  viewMenu = new JMenu("视图(L)");
  fullscreenItem = new JMenuItem("全屏(M)");
  sourceItem = new JMenuItem("源码(C)");
  reloadItem = new JMenuItem("重载(R)");
  
  //工具栏
  btnSaveAs = new JButton("另存为");
  btnBack = new JButton("退后");
  btnForward = new JButton("前进");
  btnSource = new JButton("源码");
  btnExit = new JButton("退出");
  
  bxs =Box.createHorizontalBox(); 
 }
 
 /**
 *构造器*/
 public HWebBrowser(String title){
  super(title);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
  setSize(500,400);
  
  //初始化控件
  init();
  disDefault();
  //菜单栏
  fileMenu.add(saveAsItem);
  fileMenu.addSeparator();
  fileMenu.add(exitItem);
  
  bookmarkMenu.add(saveBMItem);
  
  editMenu.add(backItem);
  editMenu.addSeparator();
  editMenu.add(forwardItem);
  
  viewMenu.add(fullscreenItem);
  viewMenu.addSeparator();
  viewMenu.add(sourceItem);
  viewMenu.addSeparator();
  viewMenu.add(reloadItem);
  
  mbrMain.add(fileMenu);
  mbrMain.add(bookmarkMenu);
  mbrMain.add(editMenu);
  mbrMain.add(viewMenu);
  
  bxs.add(lblURL);
  bxs.add(txtURL);
  bxs.add(btnGO);
  
  //工具栏
  tbrMain.add(btnSaveAs);
  tbrMain.addSeparator();
  tbrMain.add(btnBack);
  tbrMain.addSeparator();
  tbrMain.add(btnForward);
  tbrMain.addSeparator();
  tbrMain.add(btnSource);
  tbrMain.addSeparator();
  tbrMain.add(btnExit);
  tbrMain.addSeparator();
  tbrMain.add(bxs);  
  
  Container ctr = getContentPane();
  ctr.setLayout(new BorderLayout());
  //设置菜单栏
  setJMenuBar(mbrMain); 
  //设置工具栏
  ctr.add(tbrMain,BorderLayout.NORTH); 
  //设置网页框
  ctr.add(srpWeb,BorderLayout.CENTER);
  
  //注册相应事件
  etpWeb.addHyperlinkListener(this);
  btnGO.addActionListener(this);
  btnBack.addActionListener(this);
  txtURL.addActionListener(this);
  btnExit.addActionListener(this);
  btnSaveAs.addActionListener(this);
  saveAsItem.addActionListener(this);
  btnForward.addActionListener(this);
  fullscreenItem.addActionListener(this);
  sourceItem.addActionListener(this);
  btnSource.addActionListener(this);
  backItem.addActionListener(this);
  forwardItem.addActionListener(this);
  exitItem.addActionListener(this);
 }
 
 public void actionPerformed(ActionEvent evt){
  String curl = "";
  try{
   //点击转到按钮
   if(evt.getSource() == btnGO){
    curl = txtURL.getText();
    if(curl.length() > 0 && curl.startsWith("http://")){
     etpWeb.setPage(new URL(curl));
     htysIndex = htys.size() -1;
     //往历史列表中添加访问过的url
     htys.add(curl);
    }
   }
   //在地址栏回车
   if(evt.getSource() == txtURL){
    curl = txtURL.getText();
    if(curl.length() > 0 && curl.startsWith("http://")){
     etpWeb.setPage(new URL(curl));
     htysIndex = htys.size() -1;
     //往历史列表中添加访问过的url
     htys.add(curl);
    }
   }
   //点击退出
   if(evt.getSource() == btnExit || evt.getSource() == exitItem){
    System.exit(0);
   } 
   //点击另存为
   if(evt.getSource() == btnSaveAs || evt.getSource() == saveAsItem){
    curl = txtURL.getText();
    if(curl.length() > 0 && curl.startsWith("http://")){
     saveFile(curl);
    }
   }
   //点击后退按钮
   if(evt.getSource() == btnBack || evt.getSource() == backItem){
    htysIndex--;
    if(htysIndex < 0){
     htysIndex = 0;
     return;
    }
    curl = txtURL.getText();
    curl =(String)htys.get(htysIndex);
    etpWeb.setPage(new URL(curl)); 
    txtURL.setText(curl);
   }  
   //点击前进按钮
   if(evt.getSource() == btnForward || evt.getSource() == forwardItem){
    htysIndex++;
    if(htysIndex >= (htys.size()-1)){
     htysIndex = htys.size()-1;
     return;
    }
    curl =(String)htys.get(htysIndex);
    etpWeb.setPage(new URL(curl));
    txtURL.setText(curl.toString());
   }
   //点击全屏菜单
   if(evt.getSource() == fullscreenItem){
    Dimension dms = tkDf.getScreenSize();
    setSize(dms.width,dms.height);
    repaint();
   }
   //点击查看源码
   if(evt.getSource() == btnSource || evt.getSource() == sourceItem){
    curl = txtURL.getText();
    new CodeView(curl,getHtmlSource(curl));
   }
  }catch(Exception ex){
   JOptionPane.showMessageDialog(this,ex.toString(),"错误",JOptionPane.ERROR_MESSAGE);
  }
 }
 
 /**
 *设置启动时默认页面*/
 public void disDefault(){
   txtURL.setText("http://www.byhuang.cn");
   etpWeb.setContentType("text/html");
   etpWeb.setText("<html><h1>欢迎使用B.Y浏览器</h1><b>QQ:316583238 <br>Email:yi520na@126.com</b></html>");
 }
 
 /**
 *另存页面
 *@param curl String*/
 public void saveFile(final String curl){
  final String linesep=System.getProperty("line.separator");
  //HFileFilter hf = new HFileFilter("html",new String[]{"html","htm","jsp"} );
  //fc.addChoosableFileFilter(hf);
  //设置当前目录
  fc.setCurrentDirectory(new File("."));
  //设置文件窗体类型
  fc.setDialogType(JFileChooser.SAVE_DIALOG);
  //设置文件窗体标题
  fc.setDialogTitle("另存为..");
  
  if(fc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION){
   return;
  }
  repaint();
  //开启一个线程来保存文件
  Thread t = new Thread(){
   public void run(){
    try{
     //建立远程url连接,并读取远程服务器发送的文件
     URL dourl = new URL(curl);
     InputStream in =new BufferedInputStream(dourl.openStream());
     BufferedReader br = new BufferedReader(new InputStreamReader(in));
     //获取选中的文件
     File dofile = fc.getSelectedFile();
     FileWriter out = new FileWriter(dofile);
     BufferedWriter bw = new BufferedWriter(out);
     String line = null;
     while((line = br.readLine()) != null){
      bw.write(line);
      bw.newLine();
     }
     bw.close();
     br.close();
     
        String msg=curl+" 已保存在!"+linesep+dofile.getAbsolutePath();
        JOptionPane.showMessageDialog((Component)null,msg,"另存为",JOptionPane.INFORMATION_MESSAGE);           
    }catch(Exception ex){
     JOptionPane.showMessageDialog((Component)null,ex.toString(),"错误",JOptionPane.ERROR_MESSAGE);
    }
   }
  };
  
  //开启保存文件线程
  t.start();
 }
 
 /**
 *查看源码
 *@param curl String*/
 public StringBuffer getHtmlSource(String curl){
  StringBuffer sbf = new StringBuffer();
  String linesep = System.getProperty("line.separator");
  try{
   URL dourl = new URL(curl);
   BufferedReader br = new BufferedReader(new InputStreamReader(dourl.openStream()));
   String line = null;
   while((line = br.readLine()) != null){
    sbf.append(line);
    sbf.append("/r/n");
   }
   br.close();
  }catch(IOException ex){
   JOptionPane.showMessageDialog(this,ex.toString(),"错误",JOptionPane.ERROR_MESSAGE);
  }
  return sbf;
 }
 
 /**
 *实现HyperlinkListener接口的方法*/
 public void hyperlinkUpdate(HyperlinkEvent evt){
  try{
   //如果选中或者激活超链接
   if(evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
    /*此段代码是弹出一个新的窗口,但是之后关闭任何窗口
    *程序都会被终止
    HWebBrowser hwb = new HWebBrowser("B.Y浏览器");
    hwb.txtURL.setText(evt.getURL().toString());
    hwb.etpWeb.setPage(evt.getURL());
    */ 
    etpWeb.setPage(evt.getURL());
    htys.add(evt.getURL());
    htysIndex = htys.size() -1;
    txtURL.setText(evt.getURL().toString());
   }
  }catch(IOException ex){
   JOptionPane.showMessageDialog(this,ex.toString(),"错误",JOptionPane.ERROR_MESSAGE);
  }
 }
 
 public static void main(String[]args) throws Exception{
  new HWebBrowser("B.Y 浏览器");;
 }
}

 

========== CodeView.java ========= 

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.event.*;

class CodeView extends JFrame{
 private StringBuffer sbf;
 private JTextArea txtCode;
 private JButton btnDis;
 public CodeView(String title,StringBuffer sbf){
  super(title);
  this.sbf = sbf;
  txtCode = new JTextArea();
  txtCode.setLineWrap(true);
  txtCode.setText(sbf.toString());
  
  btnDis = new JButton("关闭");
  btnDis.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    dispose();
   }
  });
  
  Container ctr = getContentPane();
  ctr.add(txtCode,BorderLayout.CENTER);
  ctr.add(btnDis,BorderLayout.NORTH);
  //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setSize(500,400);
  setVisible(true);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值