/**
 * @(#)WebBrowser.java
 *网页浏览器主程序
 *
 * @author 李永玖
 * @version 1.00 2008/10/19
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileView;
import java.io.*;
import java.net.*;
import java.util.*;
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("退出(I)");
	
	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);
    	
    	//为jEditorPanel添加时间侦听
    	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('Q');
    	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);
        bar.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){
     	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;
     				//设置成非编辑状态jEditorpanel.setEditable(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){
            		}
            	}
            }
     }      
         /*
          **保存文件
          */
         void saveFile(final String url){
         	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(java.net.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){
        	String linesep,htmlLine;
        	linesep=System.getProperty("line,separator");
        	htmlSource="";
        	try{
        		java.net.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(java.net.MalformedURLException muex){
        		JOptionPane.showMessageDialog(WebBrowser.this,muex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
        	}
        	catch(Exception e){
        		JOptionPane.showMessageDialog(WebBrowser.this,e.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
        	}
        }
        /**
         *实现监听器接口的hyperlinkupdate方法
         */
        public void hyperlinkUpdate(HyperlinkEvent e){
        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);
        }	  
}
最近下载更多
wkq888 LV132020年12月11日
月亮月亮月亮星星
北站扯淡 LV92020年12月8日
月亮月亮星星
oasisqjq LV172020年11月24日
太阳星星
gongxl1 LV12020年11月9日
星星
2633820516 LV12020年6月23日
星星
y6622576 LV92020年6月13日
月亮月亮星星
3314161681 LV12020年4月12日
星星
twetnr LV12019年12月24日
星星
qingc123 LV12019年12月6日
星星
netmark LV12019年11月1日
星星
最近浏览更多
22395797 LV21月7日
星星星星
无趣的月亮啊 LV12020年12月24日
星星
ccyccy0325 LV12020年12月18日
星星
wkq888 LV132020年12月9日
月亮月亮月亮星星
北站扯淡 LV92020年12月8日
月亮月亮星星
oasisqjq LV172020年11月24日
太阳星星
wzzyy12 LV22020年11月16日
星星星星
gongxl1 LV12020年11月9日
星星
szzs802020年10月31日
暂无贡献等级
yueguangbaohe2020年10月18日
暂无贡献等级
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友