用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("保存失败");
   }
  }
 }
}