网页浏览器开发

来源:互联网 发布:群发短信软件 编辑:程序博客网 时间:2024/04/30 03:46

//WebBrowser.java

package com.jacky;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.*;public class WebBrowser extends JFrame implements HyperlinkListener,ActionListener{ //建立菜单栏JMenuBar jMenuBar1=new JMenuBar();//建立菜单组JMenu fileMenu=new JMenu("文件(F)");//建立菜单项JMenuItem saveAsItem=new JMenuItem("另存为(A)...");JMenuItem exitItem=new JMenuItem("退出(I)");JMenu editMenu=new JMenu("编辑(E)");JMenuItem forwardItem=new JMenuItem("前进");JMenuItem backItem=new JMenuItem("后退");JMenu viewMenu=new JMenu("视图(V)");JMenuItem fullscreenItem=new JMenuItem("全屏(U)");JMenuItem sourceItem=new JMenuItem("查看源码(C)");JMenuItem reloadItem=new JMenuItem("刷新(R)");// 建立工具栏JToolBar toolBar1=new JToolBar();//建立工具栏中的按钮组件JButton SaveButton=new JButton("另存为");JButton ForwardButton=new JButton("前进");JButton BackButton=new JButton("后退");                                                                                                               
JButton ViewButton=new JButton("查看源代码");JButton ExitButton=new JButton("退出");//建立工具栏用来显示地址栏JToolBar toolBar2=new JToolBar();//建立地址栏中的组件JLabel label=new JLabel("地址");JTextField jurl=new JTextField(50);JButton turnbutton=new JButton("转向");JButton RestoreButton=new JButton("窗口还原");// 建立网页显示界面JEditorPane jEditorPane=new JEditorPane();//网页文本框JScrollPane scrollPane=new JScrollPane(jEditorPane);JFileChooser chooser=new JFileChooser();//构造文件选择器JFileChooser chooser1=new JFileChooser();String htmlSource;JWindow window=new JWindow(WebBrowser.this);//使用指定的所有者框架创建窗口Toolkit toolkit=Toolkit.getDefaultToolkit();//获取默认工具包Box box=Box.createHorizontalBox();//创建一个从左到右显示其组件
//ArrayList对象,用来存放历史地址private ArrayList history=new ArrayList();//整型变量,表示历史地址的访问顺序private int historyIndex;/*构造函数 * 初始化图形用户界面*/public WebBrowser(){setTitle ("网页浏览器");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,不写的话,界面是没了,但程序还驻留在  内存中没有结束。setResizable(false);//不能手动改变框架大小 //为jEditorPane添加事件侦听jEditorPane.addHyperlinkListener(this);jMenuBar1.add(fileMenu);jMenuBar1.add(editMenu);jMenuBar1.add(viewMenu);setJMenuBar(jMenuBar1);//将菜单栏加入到框架中//将菜单项saveAsItem加入到菜单组fileMenu中fileMenu.add(saveAsItem);                                                                                                                      
fileMenu.addSeparator();fileMenu.add(exitItem);fileMenu.setMnemonic('F');//为组件fileMenu设置热键'F'                                                       
saveAsItem.setMnemonic('S');saveAsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); //为"另存为"组件设置快捷键ctrl+sexitItem.setMnemonic('Q');exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
editMenu.add(backItem);editMenu.add(forwardItem);
editMenu.setMnemonic('E');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));viewMenu.add(fullscreenItem);                                                                                                                          
viewMenu.add(sourceItem);                                                                                                                  
viewMenu.addSeparator();viewMenu.add(reloadItem);  viewMenu.setMnemonic('V');fullscreenItem.setMnemonic('U');fullscreenItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));                                                                             
sourceItem.setMnemonic('C');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));  //在工具栏中添加按钮组件   toolBar1.add(SaveButton);toolBar1.addSeparator();toolBar1.add(ForwardButton);toolBar1.addSeparator();toolBar1.add(BackButton);toolBar1.addSeparator(); toolBar1.add(ViewButton);toolBar1.addSeparator();toolBar1.add(ExitButton);box.add(label);box.add(jurl);box.add(turnbutton);toolBar2.add(box);
Container contentPane=getContentPane();//建立一个contaniner用来装各种组件 scrollPane.setPreferredSize(new Dimension(100,400));//设置大小contentPane.add(scrollPane,BorderLayout.SOUTH);contentPane.add(toolBar1,BorderLayout.NORTH);contentPane.add(toolBar2,BorderLayout.CENTER);//为组件添加事件监听                                                                                                                 
saveAsItem.addActionListener(this);forwardItem.addActionListener(this);backItem.addActionListener(this);exitItem.addActionListener(this);fullscreenItem.addActionListener(this);                                                                      
sourceItem.addActionListener(this);reloadItem.addActionListener(this);SaveButton.addActionListener(this);ForwardButton.addActionListener(this);BackButton.addActionListener(this);                                                                                             
ViewButton.addActionListener(this);ExitButton.addActionListener(this);jurl.addActionListener(this);turnbutton.addActionListener(this);  } /*实现监听器接口的actionPerformed函数*/public void actionPerformed(ActionEvent e){String url="";//点击转向按钮if(e.getSource()==turnbutton){//获得地址栏的内容url=jurl.getText();//getText()表示将当前文本作为字符串返回//url不为"",并且以"http://"开头if(url.length()>0&&url.startsWith("http://")){   try    {     //JEditorPane组件显示url的内容链接     jEditorPane.setPage(url);     //将url的内容添加到ArrayList对象history中     history.add(url);     //historyIndex的数值设为history对象的长度-1     historyIndex=history.size()-1;     //设置成非编辑状态     jEditorPane.setEditable(false);     //重新布局     jEditorPane .revalidate();//revalidate()表示因为性能原因而被重写。    }    catch(Exception ex)    {     //如果链接显示失败,则弹出选择对话框"无法打开搜索页"     JOptionPane.showMessageDialog(WebBrowser.this,"无法打开该搜索页");    }   }   //url不为"",并且不以"http://"开头   else if(url.length()>0&&!url.startsWith("http://"))   {    url="http://"+url;    try    {     jEditorPane.setPage(url );     history.add(url);     historyIndex=history.size()-1;                 jEditorPane.setEditable(false);     jEditorPane.revalidate();    }          catch(Exception ex)      {        JOptionPane.showMessageDialog(WebBrowser.this,"无法打开该搜索页");      }      }     //没有输入url,即url为空     else if(url.length()==0)     {      JOptionPane.showMessageDialog(WebBrowser.this,"请输入链接地址");     }     }   //输入地址后按回车键  if(e.getSource()==jurl)  {   url=jurl.getText();      if(url.length()>0&&url.startsWith("http://"))   {    try    {     jEditorPane.setPage(url);     history.add(url);     historyIndex=history.size()-1;     jEditorPane.setEditable(false);     jEditorPane.revalidate();     jurl.setMaximumSize(jurl.getPreferredSize());//将此组件的最大大小设置为一个常量值。    }    catch(Exception ex)    {     //如果链接显示失败,则弹出选择对话框"无法打开搜索页"     JOptionPane.showMessageDialog(WebBrowser.this,"无法打开该搜索页");    }   }      //url不为"",并且不以"http://"开头   else if(url.length()>0&&!url.startsWith("http://"))   {    url="http://"+url;    try    {     jEditorPane.setPage(url);     history.add(url);     historyIndex=history.size()-1;                 jEditorPane.setEditable(false);     jEditorPane.revalidate();    }          catch(Exception ex)      {        JOptionPane.showMessageDialog(WebBrowser.this,"无法打开该搜索页");      }      }        //没有输入url,即url为空     else if(url.length()==0)     {      JOptionPane.showMessageDialog(WebBrowser.this,"请输入链接地址");     }     }  //另存为...  else if(e.getSource()==SaveButton||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,"请输入链接地址");   }  }  //退出  else if(e.getSource()==exitItem||e.getSource()==ExitButton)  {   System.exit(0);  }             //前进  else if(e.getSource()==forwardItem||e.getSource()==ForwardButton)  {   historyIndex++;   if(historyIndex>=history.size())     historyIndex=history.size()-1;   url=jurl.getText();   try   {                //获得history对象中本地址之前访问的地址    url=(String)history.get(historyIndex);    jEditorPane.setPage(url);                //将文本修改成指定字符串    jurl.setText(url.toString());//toString()表示将类型转换成一个字符串。    jEditorPane.setEditable(false);    jEditorPane.revalidate();   }   catch(Exception ex) {}  }    //后退  else if(e.getSource()==backItem||e.getSource()==BackButton)  {   historyIndex--;   if(historyIndex<0) historyIndex=0;   url=jurl.getText();   try   {    url=(String)history.get(historyIndex);    jEditorPane.setPage(url);    jurl.setText(url.toString());    jEditorPane.setEditable(false);    jEditorPane.revalidate();   }   catch(Exception ex) {}  }      //全屏  else if(e.getSource()==fullscreenItem)  {   boolean add_RestoreButton=true;   //获得屏幕大小   Dimension size=Toolkit.getDefaultToolkit().getScreenSize();      Container content=window.getContentPane();   content.add(toolBar2,"North");   content.add(scrollPane,"Center");      //button2为单击"全屏"后的还原按钮   if(add_RestoreButton=true)   {    toolBar2.add(RestoreButton);   }   //为button2添加事件      RestoreButton.addActionListener(new ActionListener()     {      public void actionPerformed(ActionEvent evt)      {       WebBrowser.this.setEnabled(true);//设置按钮是否可被激活       window.remove(toolBar2);       window.remove(toolBar1);       window.remove(scrollPane);       window.setVisible(false);//设置窗口不可见              scrollPane.setPreferredSize(new Dimension(100,500));       getContentPane().add(scrollPane,BorderLayout.SOUTH);       getContentPane().add(toolBar2,BorderLayout.CENTER);       getContentPane().add(toolBar1,BorderLayout.NORTH);       /*toolBar2.remove(RestoreButton);*/       pack();//布置容器,让它使用显示其内容所需的最小空间。      }     });   window.setSize(size);   window.setVisible(true);  }     //查看源文件  else if(e.getSource()==sourceItem||e.getSource()==ViewButton)  {   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,"请输入链接地址");   }  }    //刷新  else if(e.getSource()==reloadItem)  {   url=jurl.getText();   if(url.length()>0&&url.startsWith("http://"))   {    try    {     jEditorPane.setPage(url);     jEditorPane.setEditable(false);     jEditorPane.revalidate();    }    catch(Exception ex) {}   }      else if(url.length()>0&&!url.startsWith("http://"))   {    url="http://"+url;    try    {     jEditorPane.setPage(url);     jEditorPane.setEditable(false);     jEditorPane.revalidate();    }    catch(Exception ex) {}   }  } } /*保存文件*/ void saveFile(final String url) {  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(java.net.MalformedURLException muex)    {     JOptionPane.showMessageDialog((Component)null,muex.toString());    }    catch(Exception ex)    {     JOptionPane.showMessageDialog((Component)null,ex.toString());    }   }  };  thread.start(); }  /*获得源代码*/ void getHtmlSource(String url) {  String linesep,htmlLine;  linesep=System.getProperty("line.separator");//行与行之间的分隔符  htmlSource="";  try  {   java.net.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(java.net.MalformedURLException muex)//抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。  {   JOptionPane.showMessageDialog(WebBrowser.this,muex.toString());  }  catch(Exception e)  {   JOptionPane.showMessageDialog(WebBrowser.this,e.toString());  } }  /*实现监听器接口hyperlinkUpdate函数*/ public void hyperlinkUpdate(HyperlinkEvent e) {  try  {   if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)//激活类型    jEditorPane.setPage(e.getURL());  }  catch(Exception ex){/*ex.printStackTrace(System.err);*/} }  public static void main(String [] args) { /*try  {   UIManager.setLookAndFeel(     UIManager.getCrossPlatformLookAndFeelClassName());  }  catch(Exception e){}*/  WebBrowser webBrowser=new WebBrowser();  webBrowser.pack();  webBrowser.setVisible(true); }}

//ViewSourceFrame.java

package com.jacky;import java.awt.*;
import javax.swing.*;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.util.*;
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 jScrollPanel=new JScrollPane(); JTextArea jTextArea1 =new JTextArea();  String htmlSource; private Object SA;  /*构造函数,初始化图形用户界面*/ 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);    jScrollPanel.getViewport().add(jTextArea1,null);  border1=BorderFactory.createEmptyBorder(4,4,4,4);  panel1.setLayout(new BorderLayout());  panel1.setBorder(border1);  panel1.add(jScrollPanel,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); }  /*实现监听器接口的actionPerformed函数*/ public void actionPerformed(ActionEvent e) {  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(IOException ex)   {    System.out.println("保存失败");   }  } }}
 
原创粉丝点击