使用jswing自制简单浏览器 实现浏览网络及本地资源 有前进,后退,刷新,文件新建等功能
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
本文由用户 jopen 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!