/**
 * @(#)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);
        }	  
}
最近下载更多
北。  LV6 2022年10月14日
wyx065747  LV67 2022年5月7日
xieweiseo  LV6 2022年1月23日
6332195  LV2 2022年1月4日
放任自流  LV1 2021年8月31日
Mayoubin2001  LV21 2021年7月9日
露无畏  LV12 2021年7月8日
夜空中最亮的星  LV8 2021年6月22日
尹恒yingying  LV18 2021年3月17日
wkq888  LV16 2020年12月11日
最近浏览更多
kkkxyh  LV13 2023年6月20日
17683946472  LV9 2023年6月8日
akittyboy  LV9 2023年5月5日
13133117021  LV4 2022年12月21日
103463  LV1 2022年12月5日
北。  LV6 2022年10月14日
暂无贡献等级
ghvhgh 2022年6月22日
暂无贡献等级
u一头热我认同你  LV1 2022年6月21日
wyx065747  LV67 2022年5月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友