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 }