用java编写简单网页浏览器,用到两个类WebBrowser and ViewSourceFreme,他们分别的功能是:
WebBrowser.java 类是网页浏览器的主类文件,生成网页浏览器的主题框架,并实现框架上各个组件的监听事件。ViewSourceFrame.java类是实现网页浏览器源代码查看的主体框架,并提供了源代码的保存功能。
好了,废话少说,直接上代码
package Browser;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.ArrayList;
import java.net.*;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.*;
public class WebBrowser extends JFrame implements HyperlinkListener,
ActionListener {
// 建立工具栏用来显示地址栏
JToolBar bar = new JToolBar();
// 建立网页显示界面
JTextField jurl = new JTextField(60);
JEditorPane jEditorPane1 = new JEditorPane();
JScrollPane scrollPane = new JScrollPane(jEditorPane1);
JFileChooser chooser = new JFileChooser();
JFileChooser chooser1 = new JFileChooser();
String htmlSource;
JWindow window = new JWindow(WebBrowser.this);
JButton button2 = new JButton("还原窗口");
Toolkit toolkit = Toolkit.getDefaultToolkit();
// 建立菜单栏
JMenuBar jMenuBar1 = new JMenuBar();
// 建立菜单组
JMenu fileMenu = new JMenu("文件(F)");
// 建立菜单项
JMenuItem saveAsItem = new JMenuItem("另存为(A)");
JMenuItem exitItem = new JMenuItem("退出(X)");
JMenu editMenu = new JMenu("编辑(E)");
JMenuItem backItem = new JMenuItem("后退");
JMenuItem forwardItem = new JMenuItem("前进");
JMenu viewMenu = new JMenu("视图(V)");
JMenuItem fullscreenItem = new JMenuItem("全屏(U)");
JMenuItem sourceItem = new JMenuItem("源代码(C)");
JMenuItem reloadItem = new JMenuItem("刷新(R)");
// 建立工具栏
JToolBar toolBar = new JToolBar();
// 建立工具栏中的按钮
JButton picSave = new JButton("另存为");
JButton picBack = new JButton("后退");
JButton picForward = new JButton("前进");
JButton picView = new JButton("查看源代码");
JButton picExit = new JButton("退出");
JLabel label = new JLabel("地址");
JButton button = new JButton("转向");
Box adress = Box.createHorizontalBox();
//ArrayList对象,用来存放历史地址
private ArrayList history = new ArrayList();
//整型变量,表示历史地址的访问顺序
private int historyIndex;
/**
* 构造函数
* 初始化图形用户界面
*/
public WebBrowser(){
setTitle("网页浏览器");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//为jEditorPane1添加时间侦听
jEditorPane1.addHyperlinkListener(this);
//为组件fileMenu设置热键‘F’
fileMenu.setMnemonic('F');
saveAsItem.setMnemonic('S');
//为“另存为”组件设置快捷键Ctrl+S
saveAsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
exitItem.setMnemonic('X');
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
//将菜单项saveAsItem加入菜单组fileMenu中
fileMenu.add(saveAsItem);
//在菜单项中添加隔离
fileMenu.addSeparator();
fileMenu.add(exitItem);
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));
editMenu.setMnemonic('E');
editMenu.add(backItem);
editMenu.add(forwardItem);
viewMenu.setMnemonic('V');
fullscreenItem.setMnemonic('U');
fullscreenItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
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));
Container contentPane = getContentPane();
//设置大小
scrollPane.setPreferredSize(new Dimension(100,500));
contentPane.add(scrollPane, BorderLayout.SOUTH);
//在工具栏中添加按钮组件
toolBar.add(picSave);
toolBar.addSeparator();
toolBar.add(picBack);
toolBar.add(picForward);
toolBar.addSeparator();
toolBar.add(picView);
toolBar.addSeparator();
toolBar.add(picExit);
contentPane.add(bar,BorderLayout.CENTER);
contentPane.add(toolBar,BorderLayout.NORTH);
viewMenu.add(fullscreenItem);
viewMenu.add(sourceItem);
viewMenu.addSeparator();
viewMenu.add(reloadItem);
jMenuBar1.add(fileMenu);
jMenuBar1.add(editMenu);
jMenuBar1.add(viewMenu);
setJMenuBar(jMenuBar1);
adress.add(label);
adress.add(jurl);
adress.add(button);
adress.add(adress);
//为组件添加事件监听
saveAsItem.addActionListener(this);
picSave.addActionListener(this);
exitItem.addActionListener(this);
picExit.addActionListener(this);
backItem.addActionListener(this);
picBack.addActionListener(this);
forwardItem.addActionListener(this);
picForward.addActionListener(this);
fullscreenItem.addActionListener(this);
sourceItem.addActionListener(this);
picView.addActionListener(this);
reloadItem.addActionListener(this);
button.addActionListener(this);
jurl.addActionListener(this);
}
/**
* 实现监听器接口的actionPerformed 函数
*/
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String url = "";
//单击转向按钮
if(e.getSource() == button){
//获取地址栏里的内容
url = jurl.getText();
//url不为空,并且以http://开头
if(url.length()>0 && url.startsWith("http://")){
try{
//JEditorPane组件显示url的内容连接
jEditorPane1.setPage(url);
//将url的内容添加到ArrayList对象history
history.add(url);
//historyIndex 的数值设为history对象的长度-1
historyIndex = history.size()-1;
//设置非编辑状态jEditorPane1.setEdittable(false);
//重新布局
jEditorPane1.revalidate();
}catch(Exception ex){
//如果连接显示失败,则弹出对话框“无法打开该页面”
JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//url不为“ ”,并且不以“http://”开头
else if(url.length()>0 && !url.startsWith("http://")){
//在url前面添加“http://”
url = "http://"+url;
try{
jEditorPane1.setPage(url);
history.add(url);
historyIndex = history.size()-1;
//设置非编辑状态jEditorPane1.setEditable(false)
jEditorPane1.revalidate();
}catch(Exception ex){
JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//没有url,即url为空
else if(url.length() == 0){
JOptionPane.showMessageDialog(WebBrowser.this, "请输入地址","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//输入地址后回车
else if(e.getSource() == jurl){
url = jurl.getText();
if(url.length()>0 && url.startsWith("http://")){
try{
jEditorPane1.setPage(url);
history.add(url);
historyIndex = history.size()-1;
//设置非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
jurl.setMaximumSize(jurl.getPreferredSize());
}catch(Exception ex){
JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
else if(url.length()>0 && !url.startsWith("http://")){
url = "http://" + url;
try{
jEditorPane1.setPage(url);
history.add(url);
historyIndex = history.size()-1;
//设置非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
}catch(Exception ex){
JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
else if(url.length() == 0){
JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//另存为.....
else if(e.getSource() == picSave || 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, "无法打开该页面","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//退出
else if(e.getSource() == exitItem || e.getSource() == picExit){
System.exit(0);
}
//后退
else if(e.getSource() == backItem || e.getSource() == picBack){
historyIndex--;
if(historyIndex < 0) historyIndex = 0;
url = jurl.getText();
try{
//获得history对象中本地址之前访问的地址
url = (String)history.get(historyIndex);
jEditorPane1.setPage(url);
jurl.setText(url.toString());
//设置成非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
}catch(Exception ex){
}
}
//前进
else if(e.getSource() == forwardItem || e.getSource() == picForward){
historyIndex++;
if(historyIndex >= history.size()) historyIndex = history.size()-1;
url = jurl.getText();
try{
//获得history对象中本地址之后访问的地址
url = (String)history.get(historyIndex);
jEditorPane1.setPage(url);
jurl.setText(url.toString());
//设置成非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
}catch(Exception ex){
}
}
//全屏
else if(e.getSource() == fullscreenItem){
boolean add_button2 = true;
//获得屏幕大小
Dimension size = toolkit.getDefaultToolkit().getScreenSize();
Container content = window.getContentPane();
content.add(bar,"North");
content.add(scrollPane,"Center");
//button2为单击“全屏”后的还原按钮
if(add_button2 == true){
bar.add(button2);
}
//为button2 添加事件
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
WebBrowser.this.setEnabled(true);
window.remove(bar);
window.remove(toolBar);
window.remove(scrollPane);
window.setVisible(false);
scrollPane.setPreferredSize(new Dimension(100,500));
getContentPane().add(scrollPane,BorderLayout.SOUTH);
getContentPane().add(bar,BorderLayout.CENTER);
getContentPane().add(toolBar,BorderLayout.NORTH);
bar.remove(button2);
pack();
}
});
window.setSize(size);
window.setVisible(true);
}
//查看源文件
else if(e.getSource() == sourceItem || e.getSource() == picView){
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, "请输入连接地址","网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
//刷新
else if(e.getSource() == reloadItem){
url = jurl.getText();
if(url.length()>0 && url.startsWith("http://")){
try{
jEditorPane1.setPage(url);
//设置成非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
}catch(Exception ex){
}
}
else if(url.length()>0 && url.startsWith("http://")){
url = "http://" + url;
try{
jEditorPane1.setPage(url);
//设置成非编辑状态jEditorPane1.setEditable(false);
jEditorPane1.revalidate();
}catch(Exception ex){
}
}
}
}
/**
* 保存文件
* @param url
*/
void saveFile(final String url) {
// TODO Auto-generated method stub
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(MalformedURLException muex){
JOptionPane.showMessageDialog((Component)null, muex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
}catch(Exception ex){
JOptionPane.showMessageDialog((Component)null, ex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
}
}
};
thread.start();
}
/**
* 查看源代码
*/
void getHtmlSource(String url) {
// TODO Auto-generated method stub
String linesep,htmlLine;
linesep = System.getProperty("line.separtor");
htmlSource = "";
try{
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(MalformedURLException muex){
JOptionPane.showMessageDialog(WebBrowser.this, muex.toString(),"网页浏览器" ,JOptionPane.ERROR_MESSAGE);
}catch(Exception e){
JOptionPane.showMessageDialog(WebBrowser.this, e.toString(),"网页浏览器" ,JOptionPane.ERROR_MESSAGE);
}
}
/**
* 实现监听器接口的hyperlineUpdate 函数
*/
public void hyperlinkUpdate(HyperlinkEvent e) {
// TODO Auto-generated method stub
try{
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
jEditorPane1.setPage(e.getURL());
}
}catch(Exception ex){
ex.printStackTrace(System.err);
}
}
/*生成一个IE对象*/
public static void main(String[] args) {
try{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
}catch(Exception e){}
WebBrowser webBrowser = new WebBrowser();
webBrowser.pack();
webBrowser.setVisible(true);
}
}
ViewSourceFrame类
package Browser;
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
import javax.swing.border.Border;
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 jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
String htmlSource;
/**
* 构造函数,初始化图形用户界面
*/
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);
jScrollPane1.getViewport().add(jTextArea1,null);
border1 = BorderFactory.createEmptyBorder(4,4,4,4);
panel1.setLayout(new BorderLayout());
panel1.setBorder(border1);
panel1.add(jScrollPane1,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);
}
/**
* 实现监听器接口的 ActionEvent 函数
*/
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
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(Exception ex){
System.out.println("保存失败");
}
}
}
}