使用jswing自制简单浏览器 实现浏览网络及本地资源 有前进,后退,刷新,文件新建等功能

jopen 9年前

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(); //保存历史记录的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());   }          }
转载自:http://takeme.iteye.com/blog/1828332