用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("保存失败");
}
}
}
}