1. 程式人生 > >既然選擇遠方,便只顧風雨兼程

既然選擇遠方,便只顧風雨兼程

使用 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());
	}

	
	
}