日期:2014-05-20 浏览次数:20930 次
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; 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和HTM页面的显示。使用了JEditorPane组件 **/ public class WebBrowser extends JFrame implements HyperlinkListener, PropertyChangeListener { /**下面是使用的Swing组件**/ // 显示HTML的面板 JEditorPane textPane; // 最底下的状态栏 JLabel messageLine; // 网址URL输入栏 JTextField urlField; // 文件选择器,打开本地文件时用 JFileChooser fileChooser; // 后退和前进 按钮 JButton backButton; JButton forwardButton; // 保存历史记录的列表 java.util.List history = new ArrayList(); // 当前页面的在历史记录列表中位置 int currentHistoryPage = -1; // 当历史记录超过MAX_HISTORY时,清除旧的历史 public static final int MAX_HISTORY = 50; // 当前已经打开的浏览器窗口数 static int numBrowserWindows = 0; // 标识当所有浏览器窗口都被关闭时,是否退出应用程序 static boolean exitWhenLastWindowClosed = false; // 默认的主页 String home = "http://www.google.com"; /** * 构造函数 */ public WebBrowser() { super("WebBrowser"); // 新建显示HTML的面板,并设置它不可编辑 textPane = new JEditorPane(); textPane.setEditable(false); // 注册事件处理器,用于超连接事件。 textPane.addHyperlinkListener(this); // 注册事件处理器,用于处理属性改变事件。当页面加载结束时,触发该事件 textPane.addPropertyChangeListener(this); // 将HTML显示面板放入主窗口,居中显示 this.getContentPane().add(new JScrollPane(textPane), BorderLayout.CENTER); // 创建状态栏标签,并放在主窗口底部 messageLine = new JLabel(" "); this.getContentPane().add(messageLine, BorderLayout.SOUTH); // 初始化菜单和工具栏 this.initMenu(); this.initToolbar(); // 将当前打开窗口数增加1 WebBrowser.numBrowserWindows++; // 当关闭窗口时,调用close方法处理 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() { public void actionPerformed(ActionEvent e) { newBrowser(); } }); JMenuItem openMenuItem = new JMenuItem("打开"); openMenuItem.setMnemonic('O'); // 当“打开”是打开文件选择器,选择待打开的文件 openMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openLocalPage(); } }); JMenuItem closeMenuItem = new JMenuItem("关闭窗口"); closeMenuItem.setMnemonic('C'); // 当“关闭窗口”时关闭当前窗口 closeMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } }); JMenuItem exitMenuItem = new JMenuItem("退出"); exitMenuItem.setMnemonic('E'); // 当“退出”时退出应用程序 exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { exit(); } }); fileMenu.add(newMenuItem); fileMenu.add(openMenuItem); fileMenu.add(closeMenuItem); fileMenu.add(exitMenuItem); //帮助菜单,就一个菜单项:关于 JMenu helpMenu = new JMenu("帮助"); fileMenu.setMnemonic('H'); JMenuItem aboutMenuItem = new JMenuItem("关于"); aboutMenuItem.setMnemonic('A'); helpMenu.add(aboutMenuItem); JMenuBar menuBar = new JMenuBar(); menuBar.add(fileMenu); menuBar.add(helpMenu); // 设置菜单栏到主窗口 this.setJMenuBar(menuBar); } /** * 初始化工具栏 */ private void initToolbar(){ // 后退按钮,退到前一页面。初始情况下该按钮不可用 backButton = new JButton("后退"); backButton.setEnabled(false); backButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { back(); } }); // 前进按钮,进到前一页面。初始情况下该按钮不可用 forwardButton = new JButton("前进"); forwardButton.setEnabled(false); forwardButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { forward(); } }); // 前进按钮,进到前一页面。初始情况下该按钮不可用 JButton refreshButton = new JButton("刷新"); refreshButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reload(); } }); // 主页按钮,打开主页 JButton homeButton = new JButton("主页"); homeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { home(); } }); JToolBar toolbar = new JToolBar(); toolbar.add(backButton); toolbar.add(forwardButton); toolbar.add(refreshButton); toolbar.add(homeButton); // 输入网址的文本框 urlField = new JTextField(); // 当用户输入网址、按下回车键时,触发该事件 urlField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { displayPage(urlField.getText()); } }); // 地址标签 toolbar.add(new JLabel(" 地址:")); toolbar.add(urlField); // 将工具栏放在主窗口的北部 this.getContentPane().add(toolbar, BorderLayout.NORTH); } /** * 设置浏览器是否在所有窗口都关闭时退出 * @param b */ public static void setExitWhenLastWindowClosed(boolean b) { exitWhenLastWindowClosed = b; } /** * 设置主页 * @param home 新主页 */ public void setHome(String home) { this.home = home; } /** * 获取主页 */ public String getHome() { return home; } /** * 访问网址URL */ private boolean visit(URL url) { try { String href = url.toString(); // 启动动画,当网页被加载完成时,触发propertyChanged事件,动画停止。 startAnimation("加载 " + href + "..."); // 设置显示HTML面板的page属性为待访问的URL, // 在这个方法里,将打开URL,将URL的流显示在textPane中。 // 当完全打开后,该方法才结束。 textPane.setPage(url); // 页面打开后,将浏览器窗口的标题设为URL this.setTitle(href); // 网址输入框的内容也设置为URL urlField.setText(href); return true; } catch (IOException ex) { // 停止动画 stopAnimation(); // 状态栏中显示错误信息 messageLine.setText("不能打开页面:" + ex.getMessage()); return false; } } /** * 浏览器打开URL指定的页面,如果成功,将URL放入历史列表中 */ public void displayPage(URL url) { // 尝试访问页面 if (visit(url)) { // 如果成功,则将URL放入历史列表中。 history.add(url); int numentries = history.size(); if (numentries > MAX_HISTORY+10) { history = history.subList(numentries-MAX_HISTORY, numentries); numentries = MAX_HISTORY; } // 将当前页面下标置为numentries-1 currentHistoryPage = numentries - 1; // 如果当前页面不是第一个页面,则可以后退,允许点击后退按钮。 if (currentHistoryPage > 0){ backButton.setEnabled(true); } } } /** * 浏览器打开字符串指定的页面 * @param href 网址 */ public void displayPage(String href) { try { // 默认为HTTP协议 if (!href.startsWith("http://")){ href = "http://" + href; } displayPage(new URL(href)); } catch (MalformedURLException ex) { messageLine.setText("错误的网址: " + href); } }