JAVA编写的浏览器,在别人的基础上做了些许修改,实现了前进,后退,刷新功能,添加了一个搜索框,具体情况在运行结果中的文件-->注意中

  1 package book.net.url;
  2 
  3 import org.eclipse.swt.SWT;
  4 import org.eclipse.swt.browser.Browser;
  5 import org.eclipse.swt.browser.CloseWindowListener;
  6 import org.eclipse.swt.browser.LocationAdapter;
  7 import org.eclipse.swt.browser.LocationEvent;
  8 import org.eclipse.swt.browser.OpenWindowListener;
  9 import org.eclipse.swt.browser.ProgressAdapter;
 10 import org.eclipse.swt.browser.ProgressEvent;
 11 import org.eclipse.swt.browser.StatusTextEvent;
 12 import org.eclipse.swt.browser.StatusTextListener;
 13 import org.eclipse.swt.browser.TitleEvent;
 14 import org.eclipse.swt.browser.TitleListener;
 15 import org.eclipse.swt.browser.WindowEvent;
 16 import org.eclipse.swt.events.KeyAdapter;
 17 import org.eclipse.swt.events.KeyEvent;
 18 import org.eclipse.swt.events.KeyListener;
 19 import org.eclipse.swt.events.MouseAdapter;
 20 import org.eclipse.swt.events.MouseEvent;
 21 import org.eclipse.swt.events.MouseListener;
 22 import org.eclipse.swt.events.SelectionAdapter;
 23 import org.eclipse.swt.events.SelectionEvent;
 24 import org.eclipse.swt.events.SelectionListener;
 25 import org.eclipse.swt.graphics.Image;
 26 import org.eclipse.swt.layout.GridData;
 27 import org.eclipse.swt.layout.GridLayout;
 28 import org.eclipse.swt.widgets.Button;
 29 import org.eclipse.swt.widgets.Composite;
 30 import org.eclipse.swt.widgets.Display;
 31 import org.eclipse.swt.widgets.Label;
 32 import org.eclipse.swt.widgets.Menu;
 33 import org.eclipse.swt.widgets.MenuItem;
 34 import org.eclipse.swt.widgets.MessageBox;
 35 import org.eclipse.swt.widgets.ProgressBar;
 36 import org.eclipse.swt.widgets.Shell;
 37 import org.eclipse.swt.widgets.TabFolder;
 38 import org.eclipse.swt.widgets.TabItem;
 39 import org.eclipse.swt.widgets.Text;
 40 
 41 public class MyLiulanqi {
 42 
 43     /*
 44      * 浏览器设置参数
 45      */
 46     private static final String HOMEPAGE = "http://www.baidu.com";// 浏览器的首页
 47     private static final String APP_TITLE = "汪某";
 48     private static final String NEXT_LINE = System.getProperty("line.separator"); //换行符
 49     private static int height = 600;
 50     private static int width = 800;
 51     
 52     private Shell shell = null;
 53     private Display display = null;
 54     private Button backButton = null;  //后退按钮
 55     private Button forwardButton = null;//前进按钮
 56     private Button stopButton = null;   //停止按钮
 57     private Button refreshButton = null;//刷新按钮
 58     private Button homepageButton = null;//回到主页按钮
 59     private Text urlText = null;        //地址输入栏按钮
 60     private Button goButton = null;     //转向按钮
 61     private Text searchText = null;     //搜索框
 62     private Button searchButton = null; //搜索按钮
 63     
 64     private ProgressBar progressBar = null; //进度条
 65     private Label statusLabel = null;      //最终网页打开过程显示
 66     private Browser browser_default = null;         //浏览器窗口
 67     private TabFolder tabFolder = null;   //browser的容器
 68     
 69     private Composite composite_tool = null;;// 工具栏区域
 70     private Composite composite_browser = null;;// 浏览窗口区域
 71     private Composite composite_status = null;;// 状态栏区域
 72     
 73     /*
 74      * 浏览器的当前标签参数
 75      */
 76 
 77 
 78     private TabItem tabItem_now = null;//当前标 
 79     private Browser browser_now = null;//当前功能浏览器
 80     
 81     /*
 82      * 浏览器菜单栏的参数
 83      */
 84     private Menu mainMenu;
 85     private MenuItem fileItem;
 86     private Menu fileMenu;
 87     private MenuItem viewItem;
 88     private Menu viewMenu;
 89     private MenuItem store_upItem;
 90     private Menu store_upMenu;
 91     private MenuItem  toolItem;
 92     private Menu toolMenu;
 93     private MenuItem helpItem;
 94     private Menu helpMenu;
 95     
 96     
 97     private volatile String newUrl = null;    // 最新输入的链接
 98     private volatile boolean loadCompleted = false;//表示当前页面完全导入
 99     private volatile boolean openNewItem = false;//表示新的页面在新窗口中打开
100     
101     public static void main(String[] args) {    
102         try {
103              MyLiulanqi window = new MyLiulanqi();
104              window.open();
105          } catch (Exception e) {
106              e.printStackTrace();
107          }
108      }
109     /*
110      * 一个SWT应用程序的基本组成部分为显示界面(Display)、
111      * 命令界面(Shell,使命令进入并使运行初始化)和窗口部件(Widgets)。
112      * Display负责管理事件循环和控制UI线程和其他线程之间的通讯。
113      * Shell是应用程序中被操作系统窗口管理器管理的窗口。
114      * 每个SWT应用程序至少需要一个Display和大于等于1个的Shell实例。
115      */
116 
117     private void open() {
118         // TODO Auto-generated method stub
119         display = Display.getDefault();
120         shell = new Shell(display);    
121         createContents();
122         shell.open();
123         shell.pack();//自动调整shell    
124         while(!shell.isDisposed()) {
125             if (!display.readAndDispatch()) {
126                 display.sleep();
127             }
128         }
129         display.dispose();
130     }
131 
132     private void createContents() {
133         // TODO Auto-generated method stub
134         
135         
136         GridLayout gridLayout = new GridLayout();
137         gridLayout.marginWidth = 0;// 组件与容器边缘的水平距离
138         gridLayout.marginHeight = 0;// 组件与容器边缘的垂直距离
139         gridLayout.horizontalSpacing = 0;// 组件之间的水平距离
140         gridLayout.verticalSpacing = 0;// 组件之间的垂直距离   
141         //设置浏览器图标,可以注释掉这一句
142         shell.setImage(new Image(Display.getCurrent(), System.getProperty("user.dir")
143                       + "\\src\\book\\net\\url\\5.bmp"));
144         //shell.setBackground(new Color(Display.getDefault(),255,100,100));         //不知道如何设置背景参数,这里使用默认的背景颜色
145         shell.setLayout(gridLayout);
146         shell.setSize(height, width);
147         shell.setText(APP_TITLE);//设置主窗口标题
148         shell.setVisible(true);        
149         
150         /*
151          * 创建浏览器界面
152          */
153         createMenu(); //事件监听功能没有实现
154         createTool();
155         createBrowser();
156         createStatus();
157         
158         /*
159          * 创建浏览器相关事件监听
160          * 很多监听功能还没有实现
161          */
162         runThread();
163     }
164     
165     /**
166      * 创建菜单栏
167      */
168     private void createMenu() {
169         // TODO Auto-generated method stub
170         //GridData gridData = new GridData();;
171         //首先建立一个菜单栏,需要使用SWT.BAR属性。
172         mainMenu = new Menu(shell, SWT.BAR);
173         //在窗体中指定需要显示的菜单栏。
174         shell.setMenuBar(mainMenu);
175         //创建顶级菜单项,需要使用SWT.CASCADE 属性。
176         //创建文件菜单
177         fileItem=new MenuItem(mainMenu, SWT.CASCADE);
178         fileItem.setText("文件");
179         //创建与顶级菜单项相关的下拉式菜单
180         fileMenu=new Menu(shell, SWT.DROP_DOWN);
181         fileItem.setMenu(fileMenu);
182         {
183             //"新建"项
184             MenuItem newBrowserItem=new MenuItem(fileMenu, SWT.CASCADE);
185             newBrowserItem.setText("新建窗口");
186             newBrowserItem.addSelectionListener(new SelectionAdapter() {
187                 @Override
188                 //存在BUG,在第一个或者最后一个窗口关闭时,所有的都关闭
189                 //各个窗口并不独立,双击标签栏也存在问题
190                 public void widgetSelected(SelectionEvent e) {
191                     // TODO Auto-generated method stub
192                     open(); //存在bug
193                 }
194                 
195             });
196             //"关闭"项
197             MenuItem closeCurrentBrowserItem = new MenuItem(fileMenu, SWT.CASCADE);
198             closeCurrentBrowserItem.setText("关闭窗口");
199             closeCurrentBrowserItem.addSelectionListener(new SelectionAdapter() {
200                 @Override
201                 public void widgetSelected(SelectionEvent e) {
202                     // TODO Auto-generated method stub
203                     shell.dispose();
204                 }            
205             });
206             
207             //"注意"项
208             MenuItem attentionItem = new MenuItem(fileMenu, SWT.CASCADE);
209             attentionItem.setText("注意");
210             attentionItem.addSelectionListener(new SelectionAdapter() {
211 
212                 @Override
213                 public void widgetSelected(SelectionEvent e) {
214                     // TODO Auto-generated method stub
215                     MessageBox attentionBox = new MessageBox(shell, SWT.OK);
216                     {
217                         attentionBox.setText("注意:");
218                         attentionBox.setMessage("很多功能没有实现,比如:" + NEXT_LINE
219                                 + "1.本浏览器是基于IE用JAVA编写的" + NEXT_LINE
220                                 + "2.菜单栏的大部分功能,包括全选,查看,收藏夹相关,工具和选项功能" + NEXT_LINE
221                                 + "3.标签页的关闭和新建功能" + NEXT_LINE
222                                 + "4.地址栏的回写也常出现错误" + NEXT_LINE
223                                 + "5.地址栏和搜索栏的比例还不协调" + NEXT_LINE
224                                 + "6.搜索栏的默认搜索引擎是百度" + NEXT_LINE
225                                 + "7.急需改善,暂时还没能力");
226                         attentionBox.open();
227                     }
228                 }
229                 
230             });
231         }
232         
233         //创建查看菜单
234         viewItem = new MenuItem(mainMenu, SWT.CASCADE);
235         viewItem.setText("查看");
236         viewMenu = new Menu(shell, SWT.DROP_DOWN);
237         viewItem.setMenu(viewMenu);
238         {
239             
240             MenuItem selectAllCurrentItem = new MenuItem(viewMenu, SWT.CASCADE); 
241             selectAllCurrentItem.setText("全选");
242             selectAllCurrentItem.addSelectionListener(new SelectionAdapter() {
243 
244                 @Override
245                 public void widgetSelected(SelectionEvent e) {
246                     // TODO Auto-generated method stub
247                     //statement
248                     //没有实现
249                 }
250             });
251             //statement
252             MenuItem findInCurrentItem = new MenuItem(viewMenu, SWT.CASCADE);
253             findInCurrentItem.setText("查找(在当前页)");
254             findInCurrentItem.addSelectionListener(new SelectionAdapter() {
255 
256                 @Override
257                 public void widgetSelected(SelectionEvent e) {
258                     // TODO Auto-generated method stub
259                     //statement
260                     //没有实现
261                 }        
262             });
263         }
264 
265         //创建收藏菜单
266         store_upItem = new MenuItem(mainMenu, SWT.CASCADE);
267         store_upItem.setText("收藏");
268         store_upMenu= new Menu(shell, SWT.DROP_DOWN);
269         store_upItem.setMenu(store_upMenu);
270         {
271             //"收藏"项
272             MenuItem addToStoreUpBox = new MenuItem(store_upMenu, SWT.CASCADE);
273             addToStoreUpBox.setText("添加到收藏夹");
274             addToStoreUpBox.addSelectionListener(new SelectionAdapter() {
275                 @Override
276                 public void widgetSelected(SelectionEvent arg0) {
277                     // TODO Auto-generated method stub
278                     //statement
279                     //没有实现
280                 }        
281             });
282             MenuItem organizeStoreUpBox = new MenuItem(store_upMenu, SWT.CASCADE);
283             organizeStoreUpBox.setText("整理收藏夹");
284             organizeStoreUpBox.addSelectionListener(new SelectionAdapter() {
285                 @Override
286                 public void widgetSelected(SelectionEvent e) {
287                     // TODO Auto-generated method stub    
288                     //statement
289                     //没有实现
290                 }            
291             });
292         }
293         
294         //创建工具菜单
295         toolItem = new MenuItem(mainMenu, SWT.CASCADE);
296         toolItem.setText("工具");
297         toolMenu = new Menu(shell, SWT.DROP_DOWN);
298         toolItem.setMenu(toolMenu);
299         {
300             //"工具"项
301             MenuItem historyItem = new MenuItem(toolMenu, SWT.CASCADE);
302             historyItem.setText("工具");
303             //"选项"项
304             MenuItem choiceItem = new MenuItem(toolMenu, SWT.CASCADE);
305             choiceItem.setText("选项");
306         }
307         
308         //创建帮助菜单栏
309         helpItem = new MenuItem(mainMenu, SWT.CASCADE);
310         helpItem.setText("关于");
311         helpMenu = new Menu(shell, SWT.DROP_DOWN);
312         helpItem.setMenu(helpMenu);
313         {
314             //"如何使用"项
315             MenuItem howToUseItem = new MenuItem(helpMenu, SWT.CASCADE);
316             howToUseItem.setText("如何使用");
317             howToUseItem.addSelectionListener(new SelectionAdapter() {
318                 @Override
319                 public void widgetSelected(SelectionEvent e) {
320                     // TODO Auto-generated method stub
321                     MessageBox messageBox = new MessageBox(shell, SWT.OK);
322                     messageBox.setText("使用方法");
323                     messageBox.setMessage("    详情请百度\r\n http://www.baidu.com");
324                     messageBox.open();            //没有这一句点击后将不会有反应    
325                 }
326                 
327             });
328             //"关于"项
329             MenuItem aboutItem = new MenuItem(helpMenu, SWT.CASCADE);
330             aboutItem.setText("关于" + APP_TITLE + "浏览器");
331             aboutItem.addSelectionListener(new SelectionAdapter() {
332                 @Override
333                 public void widgetSelected(SelectionEvent e) {
334                     // TODO Auto-generated method stub
335                     
336                     MessageBox messageBox = new MessageBox(shell, SWT.OK);
337                     messageBox.setText("关于" + APP_TITLE + "浏览器");
338                     messageBox.setMessage("   汪某的浏览器");
339                     messageBox.open();            
340                 }                
341             });
342         }
343     }
344     
345     /**
346      * 创建基本工具栏,不包括相关事件监听
347      */
348     private void createTool() {
349         // TODO Auto-generated method stub    
350         
351         composite_tool = new Composite(shell, SWT.BORDER);
352         
353         // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
354         GridData gd_composite = new GridData(SWT.FILL, SWT.CENTER, true, false);
355         gd_composite.heightHint = 30;// 高度和宽度
356         gd_composite.widthHint = width;
357         composite_tool.setLayoutData(gd_composite);
358         
359         GridLayout fl_composite = new GridLayout();
360         fl_composite.numColumns = 10;    //共有back,forward,refresh,stop,home,urltext,go七个区域
361         composite_tool.setLayout(fl_composite);
362         
363         backButton = new Button(composite_tool, SWT.BOTTOM);
364         forwardButton = new Button(composite_tool, SWT.BOTTOM);
365         stopButton = new Button(composite_tool, SWT.BOTTOM);
366         refreshButton = new Button(composite_tool, SWT.BOTTOM);
367         homepageButton = new Button(composite_tool, SWT.BOTTOM);
368         urlText = new Text(composite_tool, SWT.BORDER);
369         goButton = new Button(composite_tool, SWT.BOTTOM);
370         searchText = new Text(composite_tool, SWT.BORDER); //功能没有实现
371         searchButton = new Button(composite_tool, SWT.BOTTOM);
372         
373         
374         GridData gridData = new GridData();;
375         gridData.horizontalAlignment = SWT.FILL;
376         //gridDataBack.verticalAlignment = SWT.FILL;
377         backButton.setEnabled(true);
378         backButton.setText("后退");
379         backButton.setToolTipText("后退");
380         backButton.setLayoutData(gridData);    
381 
382         //gridDataForward.verticalAlignment = SWT.FILL;
383         forwardButton.setEnabled(true);
384         forwardButton.setText("前进");
385         forwardButton.setToolTipText("前进");
386         forwardButton.setLayoutData(gridData);
387         
388         //gridDataRefresh.verticalAlignment =SWT.FILL;
389         refreshButton.setEnabled(true);
390         refreshButton.setText("刷新");
391         refreshButton.setToolTipText("刷新当前页面");
392         refreshButton.setLayoutData(gridData);
393         
394         //gridDataStop.verticalAlignment = SWT.FILL;
395         stopButton.setEnabled(false);
396         stopButton.setText("停止");
397         stopButton.setToolTipText("停止加载页面");
398         stopButton.setLayoutData(gridData);
399         
400         //gridDataHomepage.verticalAlignment = SWT.FILL;
401         homepageButton.setEnabled(true);
402         homepageButton.setText("主页");
403         homepageButton.setToolTipText("回到主页");
404         homepageButton.setLayoutData(gridData);
405          
406         GridData gridDataUrlText = new GridData();
407         gridDataUrlText.horizontalAlignment = SWT.FILL;
408         gridDataUrlText.grabExcessHorizontalSpace = true;
409         urlText.setEditable(true);
410         urlText.setText(HOMEPAGE);
411         urlText.setToolTipText("请输入地址");
412         urlText.setLayoutData(gridDataUrlText);
413          
414         goButton.setEnabled(true);
415         goButton.setText("GO");
416         goButton.setToolTipText("GO");
417         goButton.setLayoutData(gridData);
418         
419         //搜索功能暂时还没有实现
420         GridData gridDataSearch = new GridData();
421         gridDataSearch.horizontalAlignment = SWT.FILL;
422         //是否水平抢占
423         //gridDataSearch.grabExcessHorizontalSpace = true;
424         searchText.setEditable(true);
425         searchText.setToolTipText("请输入要搜索的内容");
426         searchText.setLayoutData(gridDataSearch);
427         
428         searchButton.setEnabled(true);
429         searchButton.setText("搜索");
430         searchButton.setToolTipText("搜索");
431         searchButton.setLayoutData(gridData);
432         
433     }
434     /**
435      * 创建浏览器,不包括相关事件监听
436      */
437     private void createBrowser() {
438         // TODO Auto-generated method stub
439         composite_browser = new Composite(shell,SWT.BOTTOM);
440         // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
441         final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true);
442         gd_composite.heightHint = height - 60;// 高度和宽度
443         gd_composite.widthHint = width;
444         composite_browser.setLayoutData(gd_composite);
445         
446         GridLayout gl_composite = new GridLayout();
447         gl_composite.marginHeight = 0;// 使组件上下方向占满容器
448         gl_composite.marginWidth = 0;// 使组件左右方向占满容器
449         composite_browser.setLayout(gl_composite);
450         
451         tabFolder = new TabFolder(composite_browser, SWT.NONE);
452         final GridData gd_tabFolder = new GridData(SWT.FILL, SWT.FILL, true, true);
453         tabFolder.setLayoutData(gd_tabFolder);  
454         
455         /*
456          * 为标签添加右键功能
457          */
458         
459 
460         tabFolder.addMouseListener(new MouseListener() {
461 
462             //实现双击关闭标签页功能
463             @Override
464             public void mouseDoubleClick(MouseEvent e) {
465                 // TODO Auto-generated method stub
466                 if(1 != tabFolder.getItemCount()) { //如果标签页个数不为1
467                     browser_now.dispose();
468                     tabItem_now.dispose();
469                     tabFolder.redraw();
470                 } else {
471                     browser_now.setUrl("about:blank");
472                     browser_now.setText("标签已经全部关闭!");
473                 }
474             }
475 
476             @Override
477             public void mouseDown(MouseEvent e) {
478                 
479                 // TODO Auto-generated method stub
480                 /*the button that was pressed or released;
481                  * 1 for the first button, 左键
482                  * 2 for the second button, 中键
483                  * 3 for the third button, 右键
484                  */
485                 if (1 == e.button) {
486                     //左键按下什么都不做
487                 }
488                 
489                 if (2 == e.button) {
490                     //statement
491                     //还没想好中键按下添加什么功能
492                 }
493                 
494                 if (3 == e.button) { //如果按下了右键
495                     Menu menu_itemRightMouse = new Menu(shell,SWT.POP_UP);
496                     tabFolder.setMenu(menu_itemRightMouse);
497                     
498                     MenuItem createNewItem = new MenuItem(menu_itemRightMouse,SWT.NONE);
499                     createNewItem.setText("新建标签页");
500                     createNewItem.addSelectionListener(new SelectionAdapter() {
501                         
502                         @Override
503                         public void widgetSelected(SelectionEvent e) {
504                             // TODO Auto-generated method stub    
505                             // statement
506                             // 没有实现
507                             //tempTabItem = new TabItem(tabFolder, SWT.NONE, 0);
508 
509                         }                    
510                     });
511                     
512                     MenuItem closeItemNow = new MenuItem(menu_itemRightMouse,SWT.NONE);
513                     closeItemNow.setText("关闭当前标签页");
514                     closeItemNow.addSelectionListener(new SelectionAdapter() {
515                         @Override
516                         public void widgetSelected(SelectionEvent e) {
517                             // TODO Auto-generated method stub
518                             if(1 != tabFolder.getItemCount()) { //如果不止一个标签页
519                                 browser_now.dispose();
520                                 tabItem_now.dispose();
521                                 tabFolder.redraw();
522                                 //没有重写地址栏
523                             } else {
524                                 browser_now.setUrl("about:blank");
525                             }
526                         }                    
527                     });
528                     
529                     MenuItem closeItemAll = new MenuItem(menu_itemRightMouse,SWT.NONE);
530                     closeItemAll.setText("关闭所有标签页");
531                     closeItemAll.addSelectionListener(new SelectionAdapter() {
532                         @Override
533                         public void widgetSelected(SelectionEvent e) {
534                             // TODO Auto-generated method stub
535                             // statement
536                             // 没有实现
537                         }
538                     });
539                     
540                     MenuItem closeItemOthers= new MenuItem(menu_itemRightMouse,SWT.NONE);
541                     closeItemOthers.setText("关闭其他标签页");
542                     closeItemOthers.addSelectionListener(new SelectionAdapter() {
543                         public void widgetSelected(SelectionEvent e) {
544                             // TODO Auto-generated method stub                        
545                             // statement
546                             // 没有实现
547                         }
548                     });
549                     
550                 }
551             }
552 
553             @Override
554             public void mouseUp(MouseEvent e) {
555                 // TODO Auto-generated method stub
556                 // 还没想法实现什么功能
557             }
558             
559         });
560         
561         final TabItem tabItem_default = new TabItem(tabFolder, SWT.NONE);
562         browser_default = new Browser(tabFolder, SWT.NONE);
563         tabItem_default.setControl(browser_default);
564         browser_default.setUrl(HOMEPAGE);// 显示浏览器首页
565 
566         /*
567          * 把初始化的标签置顶,选中
568          */
569         tabFolder.setSelection(tabItem_default);
570     }
571 
572     /**
573      * 创建浏览器底部状态栏,不包括相关事件监听
574      */
575     private void createStatus() {
576         // TODO Auto-generated method stub
577         composite_status = new Composite(shell,SWT.BOTTOM);
578         // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
579         final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, false);
580         gd_composite.heightHint = 20;
581         gd_composite.widthHint = 300;
582         composite_status.setLayoutData(gd_composite);
583         
584         GridLayout gl_composite = new GridLayout();
585         gl_composite.numColumns = 2;
586         gl_composite.marginBottom = 5;
587         composite_status.setLayout(gl_composite);
588         
589         statusLabel = new Label(composite_status, SWT.NONE);
590         GridData gd_status = new GridData(SWT.FILL, SWT.CENTER, true, false);
591         gd_status.heightHint = 20;
592         gd_status.widthHint = width - 100;
593         statusLabel.setLayoutData(gd_status);
594         
595         progressBar = new ProgressBar(composite_status, SWT.BORDER  | SWT.SMOOTH);
596         progressBar.setLayoutData(new GridData());
597         progressBar.setVisible(false);// 打开过程初始不可见
598     }
599 
600     /**
601      *创建各种监听事件
602      *很多还没有实现,Menu菜单栏,关闭标签页部分功能
603      */
604     private void runThread() {
605         // TODO Auto-generated method stub
606         /*
607          * 浏览器新标签前进、后退按钮的默认可用性为不可用
608          */
609         backButton.setEnabled(false);
610         forwardButton.setEnabled(false);
611   
612         /*
613          * 获取浏览器的当前标签和功能Browser
614           */
615         tabItem_now = tabFolder.getItem(tabFolder.getSelectionIndex());
616         browser_now = (Browser) tabItem_now.getControl();
617         
618         /*
619          * 选中事件发生时,修改当前浏览器标签
620          */
621         tabFolder.addSelectionListener(new SelectionAdapter() {
622 
623             @Override
624             public void widgetSelected(SelectionEvent e) {
625                 // TODO Auto-generated method stub
626                 TabItem temp = (TabItem) e.item;
627                 if (tabItem_now != temp) { //防止重选一个标签,预防多次触发相同事件
628                     tabItem_now = temp;
629                     browser_now=(Browser)tabItem_now.getControl();
630                     
631                     /*
632                      * 在相应的标签中,前进、后退按钮可用性是不一样的
633                      */
634                     if (browser_now.isBackEnabled()) {
635                         backButton.setEnabled(true);
636                     } else {
637                         backButton.setEnabled(false);
638                     }
639                     if (browser_now.isForwardEnabled()) {
640                         forwardButton.setEnabled(false);
641                     } else {
642                         forwardButton.setEnabled(true);
643                     }
644                 }
645             }        
646         });
647         /*
648          * 添加浏览器的后退、向前、前进、停止按钮事件监听
649          */
650         backButton.addSelectionListener(new SelectionAdapter() {
651 
652 
653             @Override
654             public void widgetSelected(SelectionEvent e) {
655                 // TODO Auto-generated method stub
656                 if (browser_now.isBackEnabled()) {
657                     browser_now.back();
658                     forwardButton.setEnabled(true);
659                 }
660                 if (!browser_now.isBackEnabled()) {
661                     backButton.setEnabled(false);
662                 }
663             }    
664         });
665         
666         
667         forwardButton.addSelectionListener(new SelectionAdapter() {
668 
669             @Override
670             public void widgetSelected(SelectionEvent e) {
671                 // TODO Auto-generated method stub
672                 if (browser_now.isForwardEnabled()) {
673                     browser_now.forward();
674                     backButton.setEnabled(true);
675                 }
676                 if (browser_now.isForwardEnabled()) {
677                     forwardButton.setEnabled(false);                }
678             }        
679         });
680         
681         refreshButton.addSelectionListener(new SelectionAdapter() {
682 
683             @Override
684             public void widgetSelected(SelectionEvent e) {
685                 // TODO Auto-generated method stub
686                 browser_now.refresh();
687                 browser_now.setUrl(urlText.getText());
688                 refreshButton.setEnabled(true);
689             }    
690         });
691         
692         stopButton.addSelectionListener(new SelectionAdapter() {
693 
694             @Override
695             public void widgetSelected(SelectionEvent e) {
696                 // TODO Auto-generated method stub
697                 browser_now.stop();
698             }            
699         });
700         
701         homepageButton.addSelectionListener(new SelectionAdapter() {
702 
703             @Override
704             public void widgetSelected(SelectionEvent e) {
705                 // TODO Auto-generated method stub
706                 browser_now.setUrl(HOMEPAGE);
707                 
708             }        
709         });
710                     
711 
712         //注册显示地址的文本框事件   
713         urlText.addMouseListener(new MouseAdapter() {
714             @Override
715             public void mouseDoubleClick(MouseEvent e) {
716                 // TODO Auto-generated method stub    
717                 urlText.selectAll(); //双击选中地址栏内容
718             }
719             @Override
720             public void mouseDown(MouseEvent e) {
721                 // TODO Auto-generated method stub    
722                 // 还没想好实现什么功能
723             }
724             @Override
725             public void mouseUp(MouseEvent e) {
726                 // TODO Auto-generated method stub
727                 // 还没想好实现什么功能
728                 
729             }            
730         });
731         
732         urlText.addKeyListener(new KeyAdapter() {
733 
734             @Override
735             public void keyPressed(KeyEvent e) {
736                 // TODO Auto-generated method stub    
737                 if (SWT.CR == e.keyCode|| SWT.LF == e.keyCode) {
738                     e.doit = false; //不再监听按键事件
739                     //手动输入时,实现简单的地址栏判断功能
740                     //这里判断url是否是以.com结尾,如果不是就添加.com,否则就直接打开
741                     if(!urlText.getText().endsWith(".com")) {
742                         String tempUrl = urlText.getText() + ".com";
743                         browser_now.setUrl(tempUrl);
744                     } else {
745                         browser_now.setUrl(urlText.getText());
746                     }
747                 }
748             }
749             @Override
750             public void keyReleased(KeyEvent e) {
751                 // TODO Auto-generated method stub    
752                 // 还没想好实现什么功能
753             }        
754         });
755         
756         searchText.addKeyListener(new KeyListener() {
757 
758             @Override
759             public void keyPressed(KeyEvent e) {
760                 // TODO Auto-generated method stub
761                 if (SWT.CR == e.keyCode|| SWT.LF == e.keyCode) {
762                     e.doit = false; //不再监听按键事件
763                     //显示搜索结果
764                     //wd关键字,ct=0表示搜索所有网页,
765                     //0-所有语言,1-简体中文网页,2-繁体中文网页
766                     browser_now.setUrl("http://www.baidu.com/s?wd=" + searchText.getText() + "&ct=0");
767                 }
768             }
769             
770 
771             @Override
772             public void keyReleased(KeyEvent e) {
773                 // TODO Auto-generated method stub
774                 
775             }
776             
777         });
778         
779         searchButton.addSelectionListener(new SelectionAdapter() {
780             
781             @Override
782             public void widgetSelected(SelectionEvent e) {
783                 // TODO Auto-generated method stub
784                 browser_now.setUrl("http://www.baidu.com/s?wd=" + searchText.getText());
785             }
786             
787         });
788         
789         
790          /*
791          * 1>在addOpenWindowListener()下的open()写入e.browser = browser_new情况下,导入新的超级链接,
792          * 只有当点击页面上的链接,且链接不在新的页面打开时才会发生.
793          * 2>在addOpenWindowListener()下的open()不写入e.browser = browser_new情况下,导入新的超级链接,
794          * 只有当点击页面上的链接,且链接在新的页面打开时才会发生.
795          * 除了以上两种外,当然还包括browser.back()、browser.forward()、browser.go()、browser.setUrl()发生时触发,
796          * 但changing()在不写入e.browser = browser_new情况下,不被browser.setUrl()触发
797          */
798                 
799         browser_now.addLocationListener(new LocationAdapter() {
800 
801             @Override
802             public void changing(LocationEvent e) { // 表示超级链接地址改变了
803                 // TODO Auto-generated method stub
804                 urlText.setText(e.location);
805                 if (!openNewItem) {//新的页面在同一标签中打开
806                     backButton.setEnabled(true);//后退按钮可用,此句是后退按钮可用判定的逻辑开始点
807                 }
808             }
809             
810             @Override
811             public void changed(LocationEvent e) {
812                 // TODO Auto-generated method stub
813                 urlText.setText(e.location); //将地址写回到地址栏
814                  /*
815                     * 新的页面已经打开,browser的LocationListener已经监听完毕,openNewItem回复默认值
816                     */
817                    if(openNewItem) {
818                        openNewItem = false;
819                    }
820             }            
821         });
822         
823         
824         goButton.addSelectionListener(new SelectionAdapter() {
825             @Override
826             public void widgetSelected(SelectionEvent e) {
827                 // TODO Auto-generated method stub
828                 browser_now.setUrl(urlText.getText());
829             }    
830         });
831         
832         /*
833          *  新的超级链接页面的导入的百分比,在导入新的页面时发生,此时链接地址已知
834          */
835         browser_now.addProgressListener(new ProgressAdapter() {
836             @Override
837             public void changed(ProgressEvent e) {//本事件不断发生于页面的导入过程中
838                 progressBar.setMaximum(e.total);// e.total表示从最开始页面到最终页面的数值
839                 progressBar.setSelection(e.current);
840                 if (e.current != e.total) {//页面还没完全导入
841                     loadCompleted = false;
842                     goButton.setEnabled(false); //转向按钮不可用
843                     stopButton.setEnabled(true);
844                     progressBar.setVisible(true);// 页面的导入情况栏可见
845                 } else {
846                     loadCompleted = true;
847                     goButton.setEnabled(true); //转向按钮可用
848                     stopButton.setEnabled(false);
849                     progressBar.setVisible(false);// 页面导入情况栏不可见
850                 }
851                 //System.out.println("progress_changed");//调试语句
852             }
853     
854             @Override
855             public void completed(ProgressEvent e) {//发生在一次导入页面时,本监听器changed事件最后一次发生之前
856                 //System.out.println("progress_completed");//调试语句
857                 progressBar.setVisible(false);
858             }
859         });
860         
861         /*
862          *  获取页面内容过程,文字显示addProgressListener()过程,同时还能检测到已打开页面的存在的超级链接,就是用给功能来获取
863          *  新的链接地址的
864          */
865         browser_now.addStatusTextListener(new StatusTextListener() {
866             public void changed(StatusTextEvent e) {
867                 if (!loadCompleted) {
868                     statusLabel.setText(e.text);
869                 } else {
870                     newUrl = e.text;//页面导入完成,捕捉页面上可能打开的链接
871                 }
872                 //System.out.println("statusText_changed");//调试语句
873             }
874         });
875         
876         //为浏览器注册标题改变事件 ,改变浏览器顶部状态
877         browser_now.addTitleListener(new TitleListener() {
878             @Override
879             public void changed(TitleEvent e) {
880                 // TODO Auto-generated method stub
881                 if (!e.title.equals("about:blank")) { //如果标签栏全部关闭
882                     shell.setText(APP_TITLE + "-" + e.title);
883                 }
884                 else {
885                     shell.setText(APP_TITLE);
886                 }
887                 if (e.title.length() > 4) {//显示当前页面提示字符在标签上
888                     tabItem_now.setText(e.title.substring(0, 4) + "..");
889                 } else {
890                     tabItem_now.setText(e.title);
891                 }
892                 tabItem_now.setToolTipText(e.title);
893             }
894         });
895         /*
896          * 打开新的页面,当前打开页面新的链接需要在新的窗口页面打开时发生.addOpenWindowListener下open()中的一句
897          * e.browser = browser_new;关键部分.联系addOpenWindowListener、addVisibilityWindowListener
898          * 和addDisposeListener的值传递枢纽
899          */
900         browser_now.addOpenWindowListener(new OpenWindowListener() {
901 
902             @Override
903             public void open(WindowEvent e) {
904                 // TODO Auto-generated method stub
905                 Browser browser_new = new Browser(tabFolder, SWT.NONE);
906                 TabItem tabItem_new = new TabItem(tabFolder, SWT.NONE);
907                 tabItem_new.setControl(browser_new);
908                 tabFolder.setSelection(tabItem_new);//新打开的页面标签置顶
909                 tabFolder.redraw();//刷新容器
910                 browser_new.setUrl(newUrl);//新标签中设置新的链接地址
911                 openNewItem = true;//新的页面在新的标签中打开
912                 
913                 /*
914                  * 关键部分,告知新的页面由browser_new打开,只要实现这句就不会弹出操作系统默认的浏览器了
915                  */
916                 e.browser = browser_new;
917                 /*
918                  * 为浏览器新的标签添加事件监听
919                  */
920                 display.syncExec(new Runnable(){
921                     public void run() {
922                         runThread(); 
923                     }        
924                 });
925             }
926         });    
927         
928         /*
929          * 浏览器关闭事件,关闭当前功能浏览器,不然的话浏览器主窗口关闭了,还有进程在运行
930          */
931         //CloseWindowListener中只有一个方法,就是close()方法
932         browser_now.addCloseWindowListener(new CloseWindowListener(){
933             public void close(WindowEvent e) {
934                 browser_now.dispose();
935             }
936         });
937     }
938 }

 

posted @ 2013-02-15 17:21  追梦de人  阅读(692)  评论(0编辑  收藏  举报