既然選擇遠方,便只顧風雨兼程
阿新 • • 發佈:2019-02-10
使用 jswing 自制一個簡單的瀏覽器 實現 瀏覽網路 ,本地資源, 有前進 ,後退 ,重新整理,檔案新建等
package com.itheima.net; import java.awt.BorderLayout; import java.awt.Color; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; 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的 * @author Bin * */ public class TextWebBrowser extends JFrame implements HyperlinkListener { private static final long serialVersionUID = 1L; JEditorPane Pane; //顯示HTML的面板 JLabel messageLine; //最底下的狀態列 JTextField url; //網址URL的輸入欄 JFileChooser fileChooser; //檔案選擇器 JButton back; //後退按鈕 JButton forward; //前進按鈕 java.util.List historyReport=new ArrayList(); //儲存歷史記錄的李誒博阿 int current=-1; //當前頁面在歷史記錄中的位置 public static final int maxHistory=50; //當超過50時消除歷史記錄 static int count=0; //當前已經開啟的瀏覽器視窗數 static boolean exit=false; //是否已退出 String home="http://www.baidu.com"; //預設的主頁 //構造方法 public TextWebBrowser() throws HeadlessException { super("TextWebBrowser"); Pane=new JEditorPane(); //新建面板 Pane.setEditable(false); //不可編輯 Pane.addHyperlinkListener(this); //註冊事件處理器,用於超連結事件 this.getContentPane().add(new JScrollPane(Pane),BorderLayout.CENTER); //將面板放入主視窗中,並居中 messageLine=new JLabel(" "); //建立狀態列 this.getContentPane().add(messageLine,BorderLayout.SOUTH); this.initMenu(); //呼叫方法初始化選單 this.initToolbar(); //呼叫方法初始化工具爛 TextWebBrowser.count++; //每建立一個 瀏覽器建立 記錄數累加 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() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub newBrower(); //呼叫開啟新視窗的方法 } }); //開啟 JMenuItem openMenuItem=new JMenuItem("開啟"); //建立開啟項 openMenuItem.setMnemonic('O'); //設定快捷鍵 //選擇開啟觸發開啟視窗事件 openMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub openLocalPage(); //呼叫開啟檔案方法 } }); //關閉 JMenuItem closeMenuItem=new JMenuItem("關閉"); //建立關閉按鈕 closeMenuItem.setMnemonic('C'); //設定快捷鍵 //設定關閉視窗的方法 closeMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub close(); //呼叫關閉按鈕 } }); JMenuItem exitJMenuItem=new JMenuItem("退出"); //建立退出按鈕 exitJMenuItem.setMnemonic('E'); //設定快捷鍵 //設定退出方法 exitJMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub exit(); //呼叫退出方法 } }); fileMenu.add(newMenuItem); //將新建項新增到檔案選單下 fileMenu.add(openMenuItem); //將開啟項新增到檔案選單下 fileMenu.add(closeMenuItem); //將關閉項新增到檔案選單下 JMenuBar menuBar=new JMenuBar(); //建立選單欄 menuBar.add(fileMenu); //將檔案選單放入到選單欄 this.setJMenuBar(menuBar); //設定選單欄到主視窗上 } //初始化從工具欄 private void initToolbar() { // TODO Auto-generated method stub back=new JButton("後退"); //建立後退按鈕 back.setEnabled(false); //不可用 //設定後退事件 back.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub back(); //呼叫後退方法 } }); forward=new JButton("前進"); //建立前進按鈕 forward.setEnabled(false); //不可用 //設定前進事件 forward.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub forward(); //呼叫前進方法 } }); JButton refreshButton=new JButton("重新整理"); //refreshButton.setMnemonic('F5'); //重新整理觸發事件 refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub reload(); //呼叫重新載入方法 } }); JToolBar toolBar=new JToolBar(); toolBar.add(back); toolBar.add(forward); toolBar.add(refreshButton); url=new JTextField(); //建立文字框 //輸入位址列 回車事件 url.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub displayPage(url.getText()); // } }); toolBar.add(new JLabel("\t\t地址:")); //新增地址標籤 toolBar.add(url); this.getContentPane().add(toolBar,BorderLayout.NORTH); } private static void closeWindowWhenAllExit(boolean b) { // TODO Auto-generated method stub exit=b; } //設定主頁 public String getHome() { return home; } public void setHome(String home) { this.home = home; } //訪問網址URL private boolean visitURL(URL source){ try { System.out.println(source.toString()); String href=source.toString(); //獲取網址 Pane.setPage(source); //設定待訪問的URL this.setTitle(href); //頁面開啟後 將瀏覽器的視窗的標題設定為URL url.setText(href); //網址輸入框的內容也設定為URL return true; } catch (Exception e) { messageLine.setText("不能開啟頁面:"+e.getMessage()); return false; } } //開啟URL指定的頁面,URL放入歷史列表中 public void displayPage(URL url) { // TODO Auto-generated method stub if(visitURL(url)){ //訪問頁面是否成功 historyReport.add(url); //URL放入歷史表中 int numentries=historyReport.size(); if(numentries > maxHistory+10){ historyReport=historyReport.subList(numentries-maxHistory, numentries); numentries=maxHistory; } current=numentries-1; if(current>0){ //不是當前頁面 back.setEnabled(true); // 執行使用後退按鈕 } } } //瀏覽器開啟指定頁面 public void displayPage(String href) { try { if(!href.startsWith("http://")){ //預設為HTTP協議 href="http://"+href; } displayPage(new URL(href)); } catch (Exception e) { messageLine.setText("錯誤網址:"+href); } } //開啟本地檔案 protected void openLocalPage() { // TODO Auto-generated method stub if(fileChooser==null){ fileChooser=new JFileChooser(); //建立檔案選擇器 FileFilter filter=new FileFilter(){ //檔案過濾器 限制只接受 HTML和 HTM檔案 @Override public boolean accept(File pathname) { String fn=pathname.getName(); if(fn.endsWith(".html") || fn.endsWith(".htm")){ return true; }else { return false; } } @Override public String getDescription() { // TODO Auto-generated method stub return "HEML Files"; } }; fileChooser.setFileFilter(filter); fileChooser.addChoosableFileFilter(filter); } int result=fileChooser.showOpenDialog(this); //開啟檔案選擇器 模式窗體 if(result==JFileChooser.APPROVE_OPTION){ //選擇確定按鈕 File selectedFile=fileChooser.getSelectedFile(); try { displayPage(selectedFile.toURL()); } catch (Exception e) { e.printStackTrace(); } } } //後退的方法 protected void back() { // TODO Auto-generated method stub if(current>0){ visitURL((URL)historyReport.get(--current)); //訪問前一頁面 } back.setEnabled((current>0)); //當前下標>0 才可後退 forward.setEnabled((current<historyReport.size()-1)); } //前進的方法 protected void forward() { // TODO Auto-generated method stub if(current<historyReport.size()-1){ visitURL((URL)historyReport.get(current++)); //訪問後一個頁面 } back.setEnabled((current>0)); forward.setEnabled((current<historyReport.size()-1)); } //重新載入頁面 protected void reload() { // TODO Auto-generated method stub if(current!=-1){ //顯示空白頁面 Pane.setDocument(new javax.swing.text.html.HTMLDocument()); visitURL((URL)historyReport.get(current)); //訪問當前頁面 } } //顯示主頁方法 public void home(){ displayPage(getHome()); } //關閉 protected void close() { // TODO Auto-generated method stub this.setVisible(false); //隱藏當前視窗,銷燬視窗中的一些元件 this.dispose(); synchronized (TextWebBrowser.class) { TextWebBrowser.count--; if((count==0) && exit){ System.exit(0); } } } //退出 protected void exit() { // TODO Auto-generated method stub if(JOptionPane.showConfirmDialog(this, "你確定退出web瀏覽器?","退出",JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ //判斷是否退出 System.exit(0); } } //開啟新的瀏覽器視窗 protected void newBrower() { // TODO Auto-generated method stub TextWebBrowser b=new TextWebBrowser(); b.setSize(this.getWidth(),this.getHeight()); //視窗與當前視窗一樣大 b.setVisible(true); } //處理超連結的事件 @Override public void hyperlinkUpdate(HyperlinkEvent e) { // TODO Auto-generated method stub 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 static void main(String[]args){ TextWebBrowser.closeWindowWhenAllExit(true); TextWebBrowser brower=new TextWebBrowser(); brower.setSize(500,400); brower.setVisible(true); //顯示視窗 brower.displayPage(brower.getHome()); } }