用java编写简单网页浏览器,用到两个类WebBrowser and ViewSourceFreme,他们分别的功能是:

WebBrowser.java 类是网页浏览器的主类文件,生成网页浏览器的主题框架,并实现框架上各个组件的监听事件。ViewSourceFrame.java类是实现网页浏览器源代码查看的主体框架,并提供了源代码的保存功能。

好了,废话少说,直接上代码

package Browser;

import java.awt.*;

import javax.swing.event.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.ArrayList;
import java.net.*;

import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.*;

public class WebBrowser extends JFrame implements HyperlinkListener,
  ActionListener {
 // 建立工具栏用来显示地址栏
 JToolBar bar = new JToolBar();

 // 建立网页显示界面
 JTextField jurl = new JTextField(60);
 JEditorPane jEditorPane1 = new JEditorPane();
 JScrollPane scrollPane = new JScrollPane(jEditorPane1);

 JFileChooser chooser = new JFileChooser();
 JFileChooser chooser1 = new JFileChooser();
 String htmlSource;
 JWindow window = new JWindow(WebBrowser.this);

 JButton button2 = new JButton("还原窗口");
 Toolkit toolkit = Toolkit.getDefaultToolkit();

 // 建立菜单栏
 JMenuBar jMenuBar1 = new JMenuBar();
 // 建立菜单组
 JMenu fileMenu = new JMenu("文件(F)");

 // 建立菜单项
 JMenuItem saveAsItem = new JMenuItem("另存为(A)");
 JMenuItem exitItem = new JMenuItem("退出(X)");
 
 JMenu editMenu = new JMenu("编辑(E)");
 JMenuItem backItem = new JMenuItem("后退");
 JMenuItem forwardItem = new JMenuItem("前进");
 
 JMenu viewMenu = new JMenu("视图(V)");
 JMenuItem fullscreenItem = new JMenuItem("全屏(U)");
 JMenuItem sourceItem = new JMenuItem("源代码(C)");
 JMenuItem reloadItem = new JMenuItem("刷新(R)");
 
 // 建立工具栏
 JToolBar toolBar = new JToolBar();
 // 建立工具栏中的按钮
 JButton picSave = new JButton("另存为");
 JButton picBack = new JButton("后退");
 JButton picForward = new JButton("前进");
 JButton picView = new JButton("查看源代码");
 JButton picExit = new JButton("退出");

 JLabel label = new JLabel("地址");
 JButton button = new JButton("转向");
 
 Box adress = Box.createHorizontalBox();
 
 //ArrayList对象,用来存放历史地址
 private ArrayList history = new ArrayList();
 //整型变量,表示历史地址的访问顺序
 private int historyIndex;
 
 /**
  * 构造函数
  * 初始化图形用户界面
  */
 public WebBrowser(){
  setTitle("网页浏览器");
  setResizable(false);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  //为jEditorPane1添加时间侦听
  jEditorPane1.addHyperlinkListener(this);
  
  //为组件fileMenu设置热键‘F’
  fileMenu.setMnemonic('F');
  
  saveAsItem.setMnemonic('S');
  //为“另存为”组件设置快捷键Ctrl+S
  saveAsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
  exitItem.setMnemonic('X');
  exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
  //将菜单项saveAsItem加入菜单组fileMenu中
  fileMenu.add(saveAsItem);
  //在菜单项中添加隔离
  fileMenu.addSeparator();
  fileMenu.add(exitItem);
  
  backItem.setMnemonic('B');
  backItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));
  
  forwardItem.setMnemonic('D');
  forwardItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
  
  editMenu.setMnemonic('E');
  editMenu.add(backItem);
  editMenu.add(forwardItem);
  
  viewMenu.setMnemonic('V');
  
  fullscreenItem.setMnemonic('U');
  fullscreenItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
  
  sourceItem.setMnemonic('C');
  sourceItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
  
  reloadItem.setMnemonic('R');
  reloadItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));
  
  Container contentPane = getContentPane();
  
  //设置大小
  scrollPane.setPreferredSize(new Dimension(100,500));
  contentPane.add(scrollPane, BorderLayout.SOUTH);
  
  //在工具栏中添加按钮组件
  toolBar.add(picSave);
  toolBar.addSeparator();
  toolBar.add(picBack);
  toolBar.add(picForward);
  toolBar.addSeparator();
  toolBar.add(picView);
  toolBar.addSeparator();
  toolBar.add(picExit);
  
  contentPane.add(bar,BorderLayout.CENTER);
  contentPane.add(toolBar,BorderLayout.NORTH);
  
  viewMenu.add(fullscreenItem);
  viewMenu.add(sourceItem);
  viewMenu.addSeparator();
  viewMenu.add(reloadItem);
  
  jMenuBar1.add(fileMenu);
  jMenuBar1.add(editMenu);
  jMenuBar1.add(viewMenu);
  
  setJMenuBar(jMenuBar1);
  
  adress.add(label);
  adress.add(jurl);
  adress.add(button);
  adress.add(adress);
  
  //为组件添加事件监听
  saveAsItem.addActionListener(this);
  picSave.addActionListener(this);
  exitItem.addActionListener(this);
  picExit.addActionListener(this);
  backItem.addActionListener(this);
  picBack.addActionListener(this);
  forwardItem.addActionListener(this);
  picForward.addActionListener(this);
  fullscreenItem.addActionListener(this);
  sourceItem.addActionListener(this);
  picView.addActionListener(this);
  reloadItem.addActionListener(this);
  button.addActionListener(this);
  jurl.addActionListener(this);
 }
 /**
  * 实现监听器接口的actionPerformed 函数
  */

 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  String url = "";
  //单击转向按钮
  if(e.getSource() == button){
   //获取地址栏里的内容
   url = jurl.getText();
   //url不为空,并且以http://开头
   if(url.length()>0 && url.startsWith("http://")){
    try{
     //JEditorPane组件显示url的内容连接
     jEditorPane1.setPage(url);
     //将url的内容添加到ArrayList对象history
     history.add(url);
     //historyIndex 的数值设为history对象的长度-1
     historyIndex = history.size()-1;
     //设置非编辑状态jEditorPane1.setEdittable(false);
     //重新布局
     jEditorPane1.revalidate();
    }catch(Exception ex){
     //如果连接显示失败,则弹出对话框“无法打开该页面”
     JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
    }
   }
   //url不为“ ”,并且不以“http://”开头
   else if(url.length()>0 && !url.startsWith("http://")){
    //在url前面添加“http://”
    url = "http://"+url;
    try{
     jEditorPane1.setPage(url);
     history.add(url);
     historyIndex = history.size()-1;
     //设置非编辑状态jEditorPane1.setEditable(false)
     jEditorPane1.revalidate();
    }catch(Exception ex){
     JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
    }
   }
   //没有url,即url为空
   else if(url.length() == 0){
    JOptionPane.showMessageDialog(WebBrowser.this, "请输入地址","网页浏览器",JOptionPane.ERROR_MESSAGE);
   }
  }
  //输入地址后回车
  else if(e.getSource() == jurl){
   url = jurl.getText();
   if(url.length()>0 && url.startsWith("http://")){
    try{
     jEditorPane1.setPage(url);
     history.add(url);
     historyIndex = history.size()-1;
     //设置非编辑状态jEditorPane1.setEditable(false);
     jEditorPane1.revalidate();
     jurl.setMaximumSize(jurl.getPreferredSize());
    }catch(Exception ex){
     JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
    }
   }
   else if(url.length()>0 && !url.startsWith("http://")){
    url = "http://" + url;
    try{
     jEditorPane1.setPage(url);
     history.add(url);
     historyIndex = history.size()-1;
     //设置非编辑状态jEditorPane1.setEditable(false);
     jEditorPane1.revalidate();
    }catch(Exception ex){
     JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
    }
   }
   else if(url.length() == 0){
    JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
   }
  }
  //另存为.....
  else if(e.getSource() == picSave || e.getSource() == saveAsItem){
   url = jurl.getText().toString().trim();
   if(url.length()>0 && !url.startsWith("http://")){
    url = "http://" + url;
   }
   if(!url.equals("")){
    //保存文件
    saveFile(url);
   }
   else {
    JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
   }
  }
  //退出
  else if(e.getSource() == exitItem || e.getSource() == picExit){
   System.exit(0);
  }
  //后退
  else if(e.getSource() == backItem || e.getSource() == picBack){
   historyIndex--;
   if(historyIndex < 0)  historyIndex = 0;
   url = jurl.getText();
   try{
    //获得history对象中本地址之前访问的地址
    url = (String)history.get(historyIndex);
    jEditorPane1.setPage(url);
    jurl.setText(url.toString());
    //设置成非编辑状态jEditorPane1.setEditable(false);
    jEditorPane1.revalidate();
   }catch(Exception ex){
    
   }
  }
  //前进
  else if(e.getSource() == forwardItem || e.getSource() == picForward){
   historyIndex++;
   if(historyIndex >= history.size())  historyIndex = history.size()-1;
   url = jurl.getText();
   try{
    //获得history对象中本地址之后访问的地址
    url = (String)history.get(historyIndex);
    jEditorPane1.setPage(url);
    jurl.setText(url.toString());
    //设置成非编辑状态jEditorPane1.setEditable(false);
    jEditorPane1.revalidate();
   }catch(Exception ex){
    
   }
  }
  //全屏
  else if(e.getSource() == fullscreenItem){
   boolean add_button2 = true;
   //获得屏幕大小
   Dimension size = toolkit.getDefaultToolkit().getScreenSize();
   
   Container content = window.getContentPane();
   content.add(bar,"North");
   content.add(scrollPane,"Center");
   
   //button2为单击“全屏”后的还原按钮
   if(add_button2 == true){
    bar.add(button2);
   }
   //为button2 添加事件
   button2.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent evt){
     WebBrowser.this.setEnabled(true);
     window.remove(bar);
     window.remove(toolBar);
     window.remove(scrollPane);
     window.setVisible(false);
     
     scrollPane.setPreferredSize(new Dimension(100,500));
     getContentPane().add(scrollPane,BorderLayout.SOUTH);
     getContentPane().add(bar,BorderLayout.CENTER);
     getContentPane().add(toolBar,BorderLayout.NORTH);
     bar.remove(button2);
     pack();
    }
   });
   window.setSize(size);
   window.setVisible(true);
  }
  //查看源文件
  else if(e.getSource() == sourceItem || e.getSource() == picView){
   url = jurl.getText().toString().trim();
   if(url.length()>0 && !url.startsWith("http://")){
    url = "http://" + url;
   }
   if(!url.equals("")){
    //根据url获得源代码
    getHtmlSource(url);
    //生成显示源代码的框架对象
    ViewSourceFrame vsframe = new ViewSourceFrame(htmlSource);
    vsframe.setBounds(0,0,800,500);
    vsframe.setVisible(true);
   }
   else{
    JOptionPane.showMessageDialog(WebBrowser.this, "请输入连接地址","网页浏览器",JOptionPane.ERROR_MESSAGE);
   }
  }
  //刷新
  else if(e.getSource() == reloadItem){
   url = jurl.getText();
   if(url.length()>0 && url.startsWith("http://")){
    try{
     jEditorPane1.setPage(url);
     //设置成非编辑状态jEditorPane1.setEditable(false);
     jEditorPane1.revalidate();
    }catch(Exception ex){
     
    }
   }
   else if(url.length()>0 && url.startsWith("http://")){
    url = "http://" + url;
    try{
     jEditorPane1.setPage(url);
     //设置成非编辑状态jEditorPane1.setEditable(false);
     jEditorPane1.revalidate();
    }catch(Exception ex){
     
    }
   }
  }
 }

 /**
  * 保存文件
  * @param url
  */
 void saveFile(final String url) {
  // TODO Auto-generated method stub
  final String linesep = System.getProperty("line.separator");
  chooser1.setCurrentDirectory(new File("."));
  chooser1.setDialogType(JFileChooser.SAVE_DIALOG);
  chooser1.setDialogTitle("另存为...");
  if(chooser1.showSaveDialog(this) !=JFileChooser.APPROVE_OPTION)   return;
  this.repaint();
  Thread thread = new Thread(){
   public void run (){
    try{
     java.net.URL source = new URL(url);
     InputStream in = new BufferedInputStream(source.openStream());
     BufferedReader br = new BufferedReader(new InputStreamReader(in));
     File fileName = chooser1.getSelectedFile();
     FileWriter out = new FileWriter(fileName);
     BufferedWriter bw = new BufferedWriter(out);
     String line;
     while((line = br.readLine()) != null){
      bw.write(line);
      bw.newLine();
     }
     bw.flush();
     bw.close();
     out.close();
     String dMessage = url + "已经被保存至" + linesep + fileName.getAbsolutePath();
     String dTitle = "另存为...";
     int dType = JOptionPane.INFORMATION_MESSAGE;
     JOptionPane.showMessageDialog((Component)null, dMessage,dTitle,dType);
    }catch(MalformedURLException muex){
     JOptionPane.showMessageDialog((Component)null, muex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    }catch(Exception ex){
     JOptionPane.showMessageDialog((Component)null, ex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    }
   }
  };
  thread.start();
 }
 /**
  * 查看源代码
  */
 void getHtmlSource(String url) {
  // TODO Auto-generated method stub
  String linesep,htmlLine;
  linesep = System.getProperty("line.separtor");
  htmlSource = "";
  try{
   URL source = new URL(url);
   InputStream in = new BufferedInputStream(source.openStream());
   BufferedReader br = new BufferedReader(new InputStreamReader(in));
   while((htmlLine = br.readLine()) != null){
    htmlSource = htmlSource + htmlLine + linesep;
   }
  }catch(MalformedURLException muex){
   JOptionPane.showMessageDialog(WebBrowser.this, muex.toString(),"网页浏览器" ,JOptionPane.ERROR_MESSAGE);
  }catch(Exception e){
   JOptionPane.showMessageDialog(WebBrowser.this, e.toString(),"网页浏览器" ,JOptionPane.ERROR_MESSAGE);
  }
 }
 /**
  * 实现监听器接口的hyperlineUpdate 函数
  */
 public void hyperlinkUpdate(HyperlinkEvent e) {
  // TODO Auto-generated method stub
  try{
   if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
    jEditorPane1.setPage(e.getURL());
   }
  }catch(Exception ex){
   ex.printStackTrace(System.err);
  }
 }
 /*生成一个IE对象*/
 public static void main(String[] args) {
  try{
   UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  }catch(Exception e){}
  WebBrowser webBrowser = new WebBrowser();
  webBrowser.pack();
  webBrowser.setVisible(true);
 }
}
ViewSourceFrame类

package Browser;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;

import javax.swing.*;
import javax.swing.border.Border;
class ViewSourceFrame extends JFrame implements ActionListener{
 JPanel contentPane;
 JPanel panel1 = new JPanel();
 JPanel panel2 = new JPanel();
 Border border1;
 
 JButton closebutton = new JButton();
 JButton savebutton = new JButton();
 JScrollPane jScrollPane1 = new JScrollPane();
 JTextArea jTextArea1 = new JTextArea();
 
 String htmlSource;

 /**
  * 构造函数,初始化图形用户界面
  */
 public ViewSourceFrame(String htmlSource) {
  this.htmlSource = htmlSource;
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  setSize(new Dimension(600,500));
  setTitle("源代码");
  setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  
  contentPane = (JPanel)getContentPane();
  contentPane.setLayout(new BorderLayout());
  
  panel2.setLayout(new FlowLayout());
  
  savebutton.setText("保存");
  closebutton.setText("退出");
  
  closebutton.addActionListener(this);
  savebutton.addActionListener(this);
  
  jScrollPane1.getViewport().add(jTextArea1,null);
  border1 = BorderFactory.createEmptyBorder(4,4,4,4);
  panel1.setLayout(new BorderLayout());
  panel1.setBorder(border1);
  panel1.add(jScrollPane1,BorderLayout.CENTER);
  contentPane.add(panel1,BorderLayout.CENTER);
  
  panel2.add(savebutton);
  panel2.add(closebutton);
  
  contentPane.add(panel2,BorderLayout.SOUTH);
  this.jTextArea1.setEditable(true);
  this.jTextArea1.setText(this.htmlSource);
  //设置光标的位置,将其移动到文本区第0个字符
  this.jTextArea1.setCaretPosition(0);
 }

 /**
  * 实现监听器接口的 ActionEvent 函数
  */
 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  String url="";
  if(e.getSource() == closebutton){
   dispose();
  }
  else if(e.getSource() == savebutton){
   JFileChooser fc = new JFileChooser();
   int returnVal = fc.showSaveDialog(ViewSourceFrame.this);
   File saveFile=fc.getSelectedFile();
   try{
    FileWriter writeOut = new FileWriter(saveFile);
    writeOut.write(jTextArea1.getText());
    writeOut.close();
   }catch(Exception ex){
    System.out.println("保存失败");
   }
  }
 }
}

posted on 2014-04-13 20:21  Mr.dd  阅读(2032)  评论(0编辑  收藏  举报