package webBrowser;
import java.awt.BorderLayout;
import java.awt.Color;
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;
import org.jdesktop.jdic.browser.BrowserEngineManager;
/**
* 实现一个简单的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<URL> history = new ArrayList<URL>();
// 当前页面的在历史记录列表中位置
int currentHistoryPage = -1;
// 当历史记录超过MAX_HISTORY时,清除旧的历史
public static final int MAX_HISTORY = 50;
// 当前已经打开的浏览器窗口数
static int numBrowserWindows = 0;
// 标识当所有浏览器窗口都被关闭时,是否退出应用程序
static boolean exitWhenLastWindowClosed = false;
// 默认的主页
String home = "http://192.168.30.35:8080/welcome";
/**
* 构造函数
*/
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(toolba