package com.list;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
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.KeyStroke;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.filechooser.FileFilter;
public class WebBrowser extends JFrame implements HyperlinkListener,
PropertyChangeListener {
public static void main(String[] args) throws IOException {
// 設定浏覽器,當所有浏覽器視窗都被關閉時,退出應用程式
WebBrowser.setExitWhenLastWindowClosed(true);
// 建立一個浏覽器視窗
WebBrowser browser = new WebBrowser();
// 設定浏覽器視窗的預設大小
browser.setSize(800, 600);
// 顯示視窗
browser.setVisible(true);
// 打開首頁
browser.displayPage(browser.getHome());
}
// 顯示HTML的面闆
JEditorPane textPane;
// 最底下的狀态欄
JLabel messageLine;
// 網址URL輸入欄
JTextField urlField;
// 檔案選擇器,打開本地檔案時用
JFileChooser fileChooser;
// 後退和前進 按鈕
JButton backButton;
JButton forwardButton;
JButton button;
// 儲存曆史記錄的清單
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.szu.edu.cn/szu.asp";
public WebBrowser() {
super("WebBrowser");
// 建立顯示HTML的面闆,并設定它不可編輯
textPane = new JEditorPane();
textPane.setEditable(false);
button = new JButton("Go!");
// 注冊事件處理器,用于超連接配接事件。
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 saveMenuItem = new JMenuItem("儲存");
saveMenuItem.setMnemonic('S');
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveLocalPage();
}
});
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(saveMenuItem);
fileMenu.add(closeMenuItem);
fileMenu.add(exitMenuItem);
// 設定快捷鍵
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
InputEvent.CTRL_MASK));
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
InputEvent.CTRL_MASK));
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
InputEvent.CTRL_MASK));
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
InputEvent.CTRL_MASK));
// 幫助菜單,就一個菜單項:關于
JMenu helpMenu = new JMenu("幫助");
fileMenu.setMnemonic('H');
JMenuItem aboutMenuItem = new JMenuItem("關于");
aboutMenuItem.setMnemonic('A');
helpMenu.add(aboutMenuItem);
aboutMenuItem.setAccelerator(KeyStroke.getKeyStroke('A'));
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();
// 當使用者輸入網址、按下Enter鍵時,觸發該事件
urlField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayPage(urlField.getText());
}
});
// 當"Go!"按鈕按下時
urlField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayPage(urlField.getText());
}
});
// 位址标簽
toolbar.add(new JLabel(" 位址欄"));
toolbar.add(urlField);
toolbar.add(button);
// 将工具欄放在主視窗的北部
this.getContentPane().add(toolbar, BorderLayout.NORTH);
}
// 設定浏覽器是否在所有視窗都關閉時退出
public static void setExitWhenLastWindowClosed(boolean b) {
exitWhenLastWindowClosed = b;
}
// 設定首頁
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);
}
}
}
// 浏覽器打開字元串指定的頁面
public void displayPage(String href) {
try {
// 預設為HTTP協定
if (!href.startsWith("http://")) {
href = "http://" + href;
}
displayPage(new URL(href));
} catch (MalformedURLException ex) {
messageLine.setText("錯誤的網址: " + href);
}
}
// 打開本地檔案
public void openLocalPage() {
// 使用“建立”模式,當需要時,才建立檔案選擇器。
if (fileChooser == null) {
fileChooser = new JFileChooser();
// 使用檔案過濾器限制隻能夠HTML和HTM檔案
FileFilter filter = new FileFilter() {
public boolean accept(File f) {
String fn = f.getName();
if (fn.endsWith(".html") || fn.endsWith(".htm")) {
return true;
} else {
return false;
}
}
public String getDescription() {
return "HTML Files";
}
};
fileChooser.setFileFilter(filter);
// 隻允許選擇HTML和HTM檔案
fileChooser.addChoosableFileFilter(filter);
}
// 打開檔案選擇器
int result = fileChooser.showOpenDialog(this);
// 如果确定打開檔案,則在目前視窗中打開選擇的檔案
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try {
displayPage(selectedFile.toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
// 打開儲存檔案夾
public void saveLocalPage() {
if (fileChooser == null) {
fileChooser = new JFileChooser();
// 打開檔案選擇器
int result = fileChooser.showSaveDialog(this);
// 如果确定打開檔案,則在目前視窗中打開選擇的檔案
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try {
displayPage(selectedFile.toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
// 後退,回到前一頁
public void back() {
if (currentHistoryPage > 0) {
// 通路前一頁
visit((URL) history.get(--currentHistoryPage));
}
// 如果目前頁面下标大于0,允許後退
backButton.setEnabled((currentHistoryPage > 0));
// 如果目前頁面下标不是最後,允許前進
forwardButton.setEnabled((currentHistoryPage < history.size() - 1));
}
// 前進,回到後一頁
public void forward() {
if (currentHistoryPage < history.size() - 1) {
visit((URL) history.get(++currentHistoryPage));
}
// 如果目前頁面下标大于0,允許後退
backButton.setEnabled((currentHistoryPage > 0));
// 如果目前頁面下标不是最後,允許前進
forwardButton.setEnabled((currentHistoryPage < history.size() - 1));
}
// 重新加載目前頁面
public void reload() {
if (currentHistoryPage != -1) {
// 先顯示為空白頁
textPane.setDocument(new javax.swing.text.html.HTMLDocument());
// 再通路目前頁
visit((URL) history.get(currentHistoryPage));
}
}
// 顯示首頁
public void home() {
displayPage(getHome());
}
// 打開新的浏覽器視窗
public void newBrowser() {
WebBrowser b = new WebBrowser();
// 新視窗大小和目前視窗一樣大
b.setSize(this.getWidth(), this.getHeight());
b.setVisible(true);
}
// 關閉目前視窗,如果所有視窗都關閉,則根據exitWhenLastWindowClosed屬性,判斷是否退出應用程式
public void close() {
// 先隐藏目前視窗,銷毀視窗中的元件。
this.setVisible(false);
this.dispose();
// 将目前打開視窗數減1。
// 如果所有視窗都已關閉,而且exitWhenLastWindowClosed為真,則退出
// 這裡采用了synchronized關鍵字,保證線程安全
synchronized (WebBrowser.class) {
WebBrowser.numBrowserWindows--;
if ((numBrowserWindows == 0) && exitWhenLastWindowClosed) {
System.exit(0);
}
}
}
// 退出應用程式
public void exit() {
// 彈出對話框,請求确認,如果确認退出,則退出應用程式
if ((JOptionPane.showConfirmDialog(this, "你是否确定退出Web浏覽器?", "退出",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) {
System.exit(0);
}
}
// 實作HyperlinkListener接口。處理超連接配接事件
public void hyperlinkUpdate(HyperlinkEvent e) {
// 擷取事件類型
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 void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("page")) {
// 頁面加載完畢時,textPane的page屬性發生改變,此時停止動畫。
stopAnimation();
}
}
// 動畫消息,顯示在最底下狀态欄标簽上,用于回報浏覽器的狀态
String animationMessage;
// 動畫目前的幀的索引
int animationFrame = 0;
// 動畫所用到的幀,是一些字元。
String[] animationFrames = new String[] { "-", "\\", "|", "/", "-", "\\",
"|", "/", ",", ".", "o", "0", "O", "#", "*", "+" };
// 建立一個Swing的定時器,每個125毫秒更新一次狀态欄标簽的文本
javax.swing.Timer animator = new javax.swing.Timer(125,
new ActionListener() {
public void actionPerformed(ActionEvent e) {
animate();
}
});
// 顯示動畫的目前幀到狀态欄标簽上,并将幀索引後移
private void animate() {
String frame = animationFrames[animationFrame++];
messageLine.setText(animationMessage + " " + frame);
animationFrame = animationFrame % animationFrames.length;
}
// 啟動動畫
private void startAnimation(String msg) {
animationMessage = msg;
animationFrame = 0;
// 啟動定時器
animator.start();
}
// 停止動畫
private void stopAnimation() {
// 停止定時器
animator.stop();
messageLine.setText(" ");
}
}
2.調用浏覽器代開并非真正的java浏覽器
package com.list;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Browser {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
final JTextField url = new JTextField(20);
JButton button = new JButton("Open Browser");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OpenBrowser.openURL(url.getText().trim());
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.add(new JLabel("URL:"));
panel.add(url);
panel.add(button);
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
}
package com.list;
import javax.swing.JOptionPane;
public class OpenBrowser {
public static void openURL(String url) {
String osName = System.getProperty("os.name");
try {
if (osName.startsWith("Windows"))
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler " + url);
else {
String[] browsers = { "firefox", "opera", "konqueror",
"epiphany", "mozilla", "netscape" };
String browser = null;
for (int count = 0; count < browsers.length && browser == null; count++)
if (Runtime.getRuntime()
.exec(new String[] { "which", browsers[count] })
.waitFor() == 0)
browser = browsers[count];
Runtime.getRuntime().exec(new String[] { browser, url });
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error in opening browser"
+ ":\n" + e.getLocalizedMessage());
}
}
}
這個位址:http://blog.csdn.net/lxf9601/article/details/6967167
http://download.csdn.net/download/ajaxhu/6394751
分享到:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO1UWZ1kjZyAzYlVjMkNzMyYmNlNmN2YDOiBDM5UGOx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2014-02-28 12:42
浏覽 710
評論