jbpm5.1介绍(12)

GWT是什么

如今,编写网络应用程序是一个单调乏味且易于出错的过程。开发人员可能要花费 90% 的时间来处理浏览器行话。此外,构建、重复使用以及维护大量 JavaScript 代码库和 AJAX 组件可能困难且不可靠。Google Web Toolkit (GWT) 允许开发人员使用 Java 编程语言快速构建和维护复杂而又高性能的 JavaScript 前端应用程序,从而降低了开发难度,尤其是与 Eclipse Google 插件结合使用时,优势更明显。

google的官方说的很详细

http://code.google.com/intl/zh-CN/webtoolkit/overview.html

安装eclipse和插件

Update sites

If you are already familiar with installing Eclipse plugins, you can just use the update site URL below for your version of Eclipse.

Eclipse 3.7 (Indigo)
http://dl.google.com/eclipse/plugin/3.7

Eclipse 3.6 (Helios)
http://dl.google.com/eclipse/plugin/3.6

Eclipse 3.5 (Galileo)
http://dl.google.com/eclipse/plugin/3.5

使用群体

 

这些教程的目的是那些希望使用Google网页工具编写丰富AJAX应用程序开发可能是一个Java开发人员希望能够编写的Web应用程序应用面向对象编程,并充分利用的工具,您的Java IDE软件工程原则或者您可能GWT的能力多种浏览器排列的JavaScript生成高度优化的JavaScript大师好奇

HTML,CSS和Java知识虽然假设并不需要运行这些教程

开始之前
开始之前这些教程中,我们假设你做了以下工作
安装了Java SDK
如果你没有一个最新版本的Java SDK安装,下载并安装Sun Java标准版SDK
安装Eclipse您最喜爱Java IDE
在这些教程中,我们使用Eclipse,因为它是开源的但是,GWT配合的Eclipse您可以使用的IntelliJNetBeans或你喜欢任何Java IDE如果您使用一个Java IDE Eclipse的其他截图一些在本教程中的具体说明会有所不同,基本GWT的概念将是相同的
如果您的Java IDE不包括Apache Ant的支持你可以下载并解压缩Ant来轻松编译和运行GWT应用程序
安装Eclipse的谷歌插件
为Eclipse插件添加到Eclipse功能创建和发展GWT应用程序
下载Google Web工具包
Google网页工具可以下载Eclipse的谷歌插件另外,下载您的操作系统谷歌Web工具包近期分布
解压目录中GWT分布要运行它。
GWT没有一个安装程序你需要所有文件运行使用GWT位于提取的目录
也可选择做到以下几点:
安装谷歌的App Engine SDK
的App Engine允许你运行Java Web应用程序包括GWT应用程序Google的基础设施在App Engine SDK可以下载Eclipse的谷歌插件另外,分别用于Java的App Engine SDK下载

GWT的教程

开始从头开发StockWatcher应用程序与谷歌Web工具包您将学习创建一个GWT项目建立GWT的wigdets板,代码在Java语言中客户端功能在托管模式下调试用户界面应用CSS样式的Java编译成JavaScript运行中的应用Web模式

客户/服务器通信
通过GWT的RPC服务器通信
添加服务器使用GWT RPC调用您将学习如何进行异步调用序列化的Java对象处理异常

通过HTTP检索JSON数据
发出HTTP请求从服务器检索JSON数据同样的技术也可用于检索XML数据

国际化
GWT应用程序的国际
翻译成另一种语言使用静态字符串国际一个GWT应用程序用户界面

测试
使用JUnit进行单元测试
GWT应用程序的使用JUnit单元测试

的App Engine
GWT和谷歌的App Engine
GWT应用程序部署到App Engine

入门

在本教程中,你将会这个简单的AJAX应用程序StockWatcher

继续前进,尝试StockWatcher出来添加一些股票代码看看它是如何工作的

建设StockWatcher过程您将学习如何GWT提供的工具为您

    在Java浏览器应用程序使用您所选择Java IDE
    调试Java托管模式模拟浏览器体验
    交叉编译你的Java代码高度优化的JavaScript
    保持一个多个浏览器实现代码(JavaScript)的基地(JavaScript
 

AJAX应用程序开发过程中使用GWT

入门教程分为8节一个典型的应用程序开发周期基于前面的每个部分这个基本StockWatcher实现所有功能编码客户端服务器端编码客户机/服务器通信覆盖其他教程

步骤1:创建一个GWT项目

在这一点上你下载了谷歌Web工具包近期分布

在本节中您将创建使用Eclipse的谷歌插件GWT的命令行实用工具webAppCreator StockWatcher项目这些公用事业发电项目的子目录和文件需要开始工作为了测试你的项目配置是否正确,你会在托管模式下运行GWT starter应用程序然后,您将检查所创建的项目文件

1。创建一个GWT应用程序
创建StockWatcher应用程序使用Eclipse

使用GWT的好处之一可以利用的工具,重构,代码完成,调试,一个Java IDE在本教程中,我们使用Eclipse,因为它广泛使用自由然而,随意使用您喜欢的IDE

谷歌插件​​为Eclipse包含一个向导用于创建GWT应用程序下面是创建一个启动应用程序步骤

    工具栏上,单击“新建Web应用程序项目按钮图标
    填写项目的细节
        输入项目名称“StockWatcher
        输入包“com.google.gwt.sample.stockwatcher
        确保使用Google Web Toolkit的检查选择使用默认SDK(GWT)是
        (可选)如果您使用谷歌应用程序引擎,请检查并确定使用Google App Engine是使用默认SDK应用引擎选定的
        如果你没有安装软件开发工具包当你安装Eclipse的谷歌插件你应该单击配置的SDK...指定的GWT在App Engine SDK解压缩的目录
    点击Finish按钮

与GWT1.6开始已被合并命令行工具projectCreatorapplicationCreator的webAppCreator

    创建StockWatcher应用程序
    在命令行运行webAppCreator并把它传递以下参数

webAppCreator -out StockWatcher com.google.gwt.sample.stockwatcher.StockWatcher

超时参数指定目录放置生成的文件最后一个参数是GWT模块名称
    提示如果您包括GWT的命令行工具在你的PATH环境变量你不会有调用由他们指定完整路径
    GWT webAppCreator生成项目子目录和文件需要开始

Created directory StockWatcher/src
Created directory StockWatcher/war
Created directory StockWatcher/war/WEB-INF
Created directory StockWatcher/war/WEB-INF/lib
Created directory StockWatcher/src/com/google/gwt/sample/stockwatcher
Created directory StockWatcher/src/com/google/gwt/sample/stockwatcher/client
Created directory StockWatcher/src/com/google/gwt/sample/stockwatcher/server
Created file StockWatcher/src/com/google/gwt/sample/stockwatcher/StockWatcher.gwt.xml
Created file StockWatcher/war/StockWatcher.html
Created file StockWatcher/war/StockWatcher.css
Created file StockWatcher/war/WEB-INF/web.xml
Created file StockWatcher/src/com/google/gwt/sample/stockwatcher/client/StockWatcher.java
Created file StockWatcher/src/com/google/gwt/sample/stockwatcher/client/GreetingService.java
Created file StockWatcher/src/com/google/gwt/sample/stockwatcher/client/GreetingServiceAsync.java
Created file StockWatcher/src/com/google/gwt/sample/stockwatcher/server/GreetingServiceImpl.java
Created file StockWatcher/build.xml
Created file StockWatcher/README.txt
Created file StockWatcher/.project
Created file StockWatcher/.classpath
Created file StockWatcher/StockWatcher.launch
Created file StockWatcher/war/WEB-INF/lib/gwt-servlet.jar

 目录结构

/src/com/google/gwt/sample/stockwatcher 包含GWT模块的定义初始应用程序文件

/war 静态资源可以公开服务如图像文件样式表和HTML主机网页

/war/WEB-INF Java Web应用程序文件

 /war/WEB-INF/lib  Java Web应用程序

开始使用GWT1.6以后静态文件都被移到/war下

创建的文件

    StockWatcher.gwt.xml
    GWT模块定义
    StockWatcher.html
    主网页
    StockWatcher.css
    应用样式表
    web.xml中的
    Java Web应用程序描述
    StockWatcher.java
    GWT切入点
    GreetingService.javaGreetingServiceAsync.javaGreetingServiceImpl.java
    GWT的样品RPC类
    gwt-servlet.jar
    GWT服务器运行时

脚本创建

    build.xml文件
    在托管模式下运行应用程序GWT编译器命令行调用Ant构建文件。

创建Eclipse的文件

    项目
    类路径
    StockWatcher.launch

看到webAppCreator选项的完整列表参阅命令行工具webAppCreator
项目结构更多信息参阅开发人员指南,目录/公约

2。测试默认项目的组成部分

检查所有项目组件创建运行在托管模式下启动应用程序在托管模式下,你可以在浏览器中应用互动就像你当它最终部署
运行在托管模式下从Eclipse)应用程序

    Package Explorer视图,选择StockWatcher项目
    工具栏上,单击运行按钮Web应用程序运行

运行托管模式从Eclipse应用程序

webAppCreator创建一个Ant构建,目标是在托管模式下运行应用程序文件

    在命令行中改变StockWatcher目录
    执行

    ant hosted

    提示如果在你的PATH环境变量Ant命令行工具你不会有调用由他们指定完整路径

GWT的打开两个窗口托管模式浏览器和发展外壳或控制台发展外壳包含一个日志查看器来显示状态和错误消息托管模式浏览包含起动应用程序

GWT起动应用程序来帮助您测试所有组件的安装和配置之前,开始发展船舶当你开始编写StockWatcher应用程序,你会替换为自己的首发应用程序代码

终止起动应用程序GWT菜单选择退出的GWT

3。研究项目的组成部分

让我们来看看一些生成的文件看他们如何结合在一起,形成GWT项目
模块XML文件

打开模块XML文件StockWatcher/src/com/google/gwt/sample/stockwatcher/StockWatcher.gwt.xml.
包含GWT模块收集资源,包括一个GWT应用程序共享定义默认情况下,StockWatcher继承每个项目所需的核心GWT功能另外,您可以指定其他GWT模块继承

在模块XML文件,您可以指定您的应用程序的入口点类为了编译一个GWT模块必须指定一个切入点如果一个GWT模块没有切入点,那么只能被继承其他模块可能包括其他模块模块XML文件指定入口点如果这样,那么你的模块多个入口点。每个入口点顺序执行。

默认情况下,StockWatcher使用两个样式表GWT的默认样式表standard.css(这是通过继承主题引用,并应用样式表这是webAppCreator生成StockWatcher.css在本教程后面您将学习如何覆盖默认的GWT的风格

主网页
打开主机页面StockWatcher/战争/ StockWatcher.html
为Web应用程序代码执行在一个HTML文档在GWT中,我们称这种宿主页面例如,StockWatcher项目宿主页面StockWatcher.html
宿主页面引用应用样式表StockWatcher.css
主机页面引用由GWT产生负责页面上的动态元素JavaScript源代码路径整个身体的元素的内容可以动态生成的,例如,因为它初始应用程序但是,当您执行StockWatcher应用程序你会使用静态和动态元素混合您将创建一个HTML<DIV>元素作为占位符使用动态生成的页面部分

选择Quirks模式与标准模式

为了提供更好的跨浏览器兼容性,GWT设置的HTML 4.01过渡的DOCTYPE声明。这台渲染引擎“Quirks模式”。如果你,而不是要呈现在“标准模式”的应用程序,还有一些其他文档类型,您可以使用武力的浏览器这个渲染模式。在一般情况下,GWT应用程序将在“标准模式”一样好“Quirks模式”,但在一些情况下,使用面板和部件可能无法正确​​呈现。此问题已得到大大改善,因为GWT 1.5的,和正在做更多的工作来解决这个问题一劳永逸。

保留浏览器历史记录

GWT提供了帮助满足您的应用程序一个网页的用户的期望在他们的能力这种情况下作为一个多页向导或购物车/结帐情况下使用浏览器的后退按钮具体机制宿主页面包含IFRAME标记纳入GWT应用程序历史支持必需

了解GWT应用程序管理浏览器历史记录更多信息参阅开发人员指南历史

应用样式表

打开应用样式表StockWatcher/战争/ StockWatcher.css

样式表是每个项目相关默认情况下,应用程序样式表StockWatcher.css包含起动应用程序样式规则本教程中应用样式“部分中取代起动应用程序的样式规则StockWatcher应用程序的样式规则

正如任何网页可以指定多个样式表他们的继承顺序列出多个样式表,也就是说,最后一个样式中列出最具体的样式规则

Java源代码

打开StockWatcher入口点类StockWatcher/src/com/google/gwt/sample/stockwatcher/client/StockWatcher.java.
目前StockWatcher.java包含起动应用程序Java源代码在本教程中,您将客户端代码StockWatcher替换此代码。
StockWatcher类实现了GWT接口的EntryPoint包含的方法onModuleLoad由于StockWatcherStockWatcher的模块定义入口点类指定当您启动StockWatcher onModuleLoad方法被称为
StockWatcher继承通过其他GWT模块StockWatcher模块定义StockWatcher.gwt.xml功能例如,构建用户界面能够包括com.google.gwt.user.client.ui类型资源因为它是GWT的核心功能一部分包含在GWT模块com.google gwt.user.User

下一步是什么

此时,您已经创建StockWatcher应用程序存根文件加载到Eclipse中(或任何Java IDE中你喜欢项目
现在,您可以设计StockWatcher应用程序

2设计中的应用

此时,您已经创建存根文件你需要开始编码StockWatcher

在本节中你会检讨的功能要求和设计用户界面

    检查的功能要求。
    标识用户界面设计的元素

1。检查的功能要求

最初想要StockWatcher应用程序做6件事

    提供用户的能力,新增股票 供应非法字符或现有股票在输入简单的验证
    显示每个股票以下信息符号,价格自上次刷新,更改
    用户提供的能力,从列表中删除的股票
    刷新的股票价格。
    上次刷新数字和百分比计算的变化
    显示显示最后更新时间戳

2。识别用户界面设计元素

研究StockWatcher功能需求您决定需要这些UI元素

    一个表:持有股票数据
    两个按钮:添加股票和删除它们
    一个输入框输入股票代码
    时间戳显示上次刷新的时间和日期

设计团队建议增加以下内容

    一个标志
    一个头
    表明是否在价格上变化积极或消极的颜色

包括静态元素

GWT没有规定如何打好你的HTML页面 GWT应用程序可以占用整个浏览器窗口因为它启动应用程序或者,它可以被嵌入现有的页面,因为它本教程的入门页面
StockWatcher应用程序包含静态和动态元素谷歌代码标识和StockWatcher在HTML宿主页面静态元素编程使用GWT小部件和面板创建所有其他元素

下一步是什么

在这一点上检讨StockWatcher的功能要求一个清晰的思路是什么StockWatcher你知道你需要实现什么UI元素您想如何打好出来

现在,您可以建立使用GWT小部件和面板用户界面

第三步:构建用户界面

第三步:构建用户界面

此时已经创建StockWatcher项目的组成部分检讨其功能要求和用户界面设计在本节中您将构建GWT小部件和面板用户界面

    选择GWT小部件需要实现的UI元素
    选择所需的GWT UI元素布局面板
    嵌入宿主页面StockWatcher.html应用程序
    实施StockWatcher.java部件和面板
    测试在托管模式下布局

GWT的盾牌太多担心浏览器兼容如果构建GWT小部件和复合材料界面,应用程序将同样的Firefox,IE浏览器,

Opera和Safari的最新版本然而DHTML的用户界面仍然显着离奇因此,还必须在每个浏览测试您的应用程序彻底

1。选择GWT小部件实现UI元素

首先,看构件并选择每个UI元素GWT部件

构件的部件有一个默认的样式所以他们看起来不完全因为他们将最终实施StockWatcher不要担心这个问题首先你会获得部件的工作重点然后,在应用样式你会改变自己的外观与CSS
库存数据表

GWT提供了一个特殊的表部件称为FlexTable FlexTable部件根据需求创建细胞正是你需要含有股票数据因为你不知道用户将增加多少股票 FlexTable部件实现一个表将展开或折叠用户增加删除股票
按钮

只要有可能,GWT按照浏览器的原生用户界面元素例如,一个按钮构件成为一个真正HTML<button>而不是一种人工合成的类似按钮的控件的内置,例如,一个<div>这意味着在不同浏览器不同客户端操作系统适当GWT按钮呈现使用本地浏览器控件好处是,他们快速,方便,和最熟悉的用户此外,他们可以用CSS样式

输入框

GWT提供几个部件来创建字段用户可以输入

    单行文本框TextBox的部件,
    PassWordTextBox部件一个文本框,视觉口罩输入
    多行文本框TextArea的部件,
    SuggestBox显示项目配置设置

StockWatcher用户输入一个股票代码这是单行文本,因此,实现一个TextBox部件

标签

按钮构件对比“标签”widget不<label>元素的HTMLHTML表单中使用地图相反它映射到一个<div>元素其中包含任意文本,
而不是
解释为HTML作为一个<div>元素,它一个块级元素而不是一个内联元素

 

<div class="gwt-Label">Last update : Oct 1, 2008 1:31:48 PM</div>

如果你兴趣GWT小部件,您将使用构建StockWatcher界面API参考PEEK,单击下面的链接表中

2。选择GWT的面板布局的UI元素

现在你知道你会使用什么部件,你会决定如何打好他们使用GWT面板 GWT提供了几种类型面板来管理布局面板可嵌套在其他面板

这是类似于铺设您的网页在HTML中使用嵌套div元素 StockWatcher你会使用嵌套在一个垂直面板水平面板

水平面板

这两个用于增加对股票输入框键入一个新的股票代号“添加”按钮密切相关的功能你想要让他们在一起视觉元素。要打好他们并排

你会一个水平面板TextBox的部件和一个Button组件在Java代码中创建一个HorizontalPanel实例命名addPanel

垂直面板

你想奠定了剩余的元素垂直

    FlexTable部件股市
    新增股份面板:包含输入框添加按钮
    标签小部件时间戳

你会做一个垂直面板在Java代码中创建一个VerticalPanel实例命名mainPanel中

根面板

更多面板,您需要在用户界面可见面板面板您的应用程序的动态元素容器这是任何GWT用户界面层次结构顶部

有两种方法可以使用一个根面板生成页面整个身体嵌入在体内产生特定元素
根面板包装在HTML宿主页面元素默认情况下(也就是说,如果你没有宿主页面添加任何占位符根面板包裹身体的元素然而,

可以换任何元素如果你的名字,然后,当你调用根面板作为一个参数传递名称你会看到如何接下来的两部分作品时StockWatcher

 

RootPanel.get()             // Default. Wraps the HTML body element.
RootPanel.get("stockList")  // Wraps any HTML element with an id of "stockList"

主机页面可以包含多个根面板例如,如果嵌入到主机多个GWT小部件或面板每一个都可以独立实施自己的根面板包裹

3。嵌入在主机应用

为了得到StockWatcher应用程序运行在浏览器中,你需要嵌入一个HTML文件,HTML宿主页面 StockWatcher项目StockWatcher.html主机页面生成webAppCreator对于起动应用程序StockWatcher.html一个空体元素因此根面板包裹整个身体的元素在浏览器中显示一切都是动态内置与GWT如果您的应用程序没有静态元素你就不会需要编辑的HTML宿主页面

然而,StockWatcher将使用一些静态的HTML文本和图像除了动态元素您将嵌入浏览器页面使用一个占位符<div>元素命名stockListGWT应用程序这个执行策略是嵌入到现有的应用程序GWT特别有用

    打开主机页面StockWatcher/war/ StockWatcher.html
    元素更改标题文本StockWatcher
    在body元素中添加一个<H1>标题,StockWatcher
    在body元素添加一个<div>元素并给它一个ID stockList
    起动项目申请删除不需要的元素

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <link type="text/css" rel="stylesheet" href="StockWatcher.css">

    <title>StockWatcher</title>

    <script type="text/javascript" language="javascript" src="stockwatcher/stockwatcher.nocache.js"></script>
  </head>

  <body>

    <h1>StockWatcher</h1>

    <div id="stockList"></div>

    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>

    <h1>Web Application Starter Project</h1>
    <table align="center">
      <tr>
        <td colspan="2" style="font-weight:bold;">Please enter your name:</td>

      </tr>
      <tr>
        <td id="nameFieldContainer"></td>
        <td id="sendButtonContainer"></td>
      </tr>
    </table>
  </body>
</html>

 

 注:HTML注释

4。执行部件和面板

接下来,您将构建GWT小部件和面板用户界面

大部分的UI就会显示StockWatcher启动所以你执行他们onModuleLoad方法在本节中,你会:

    实例每个部件和面板
    创建表中持有的股票数据
    铺陈部件使用添加股票面板主面板
    根面板主要面板
    将光标移动输入框焦点

您可以按照教程一步一步可以剪切和粘贴年底总结整个代码

1。实例每个部件和面板

    实例每个部件面板使用字段初始
    打开StockWatcher/src/com/google/gwt/sample/stockwatcher/client/StockWatcher.java.
    StockWatcher.java起动应用程序用下面的代码替换所有现有的代码

 

package com.google.gwt.sample.stockwatcher.client;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // TODO Create table for stock data.
    // TODO Assemble Add Stock panel.
    // TODO Assemble Main panel.
    // TODO Associate the Main panel with the HTML host page.
    // TODO Move cursor focus to the input box.

  }

}

 

 Eclipse的标志变量的定义因为他们不能得到解决的类型
提示:其中一个方法可以利用Eclipse是使用它的“建议”功能添加所需的进口报关单

包括相应的​​进口报关单
在X获得建议
通过按回车键选择导入的EntryPointcom.google.gwt.core.client.EntryPoint)”

申报进口报关单以同样的方式解决所有其他错误如果你不使用Eclipse,剪切粘贴突出显示的代码

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // TODO Create table for stock data.
    // TODO Assemble Add Stock panel.
    // TODO Assemble Main panel.
    // TODO Associate the Main panel with the HTML host page.
    // TODO Move cursor focus to the input box.

  }

}

 2。创建一个股票数据

实施,将持有股票数据设置标题行显示当用户启动StockWatcher要做到这一点使用setText方法建立每列标题标签符号,价格,更改删除

    库存数据创建
    onModuleLoad方法取代TODO注释突出显示的代码

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // Create table for stock data.
    stocksFlexTable.setText(0, 0, "Symbol");
    stocksFlexTable.setText(0, 1, "Price");
    stocksFlexTable.setText(0, 2, "Change");
    stocksFlexTable.setText(0, 3, "Remove");

    // TODO Assemble Add Stock panel.
    // TODO Assemble Main panel.
    // TODO Associate the Main panel with the HTML host page.
    // TODO Move cursor focus to the input box.

  }

}

 3。制订的部件

铺陈的部件,您将装配两个小组,新增股票面板主面板首先组装的添加库存面板水平面板包装输入框“添加”按钮然后组装面板垂直面板,指定库存清单新增股票面板和时间戳布局

    布置新增股票面板主面板的部件
    onModuleLoad方法取代TODO注释突出显示的代码

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // Create table for stock data.
    stocksFlexTable.setText(0, 0, "Symbol");
    stocksFlexTable.setText(0, 1, "Price");
    stocksFlexTable.setText(0, 2, "Change");
    stocksFlexTable.setText(0, 3, "Remove");

    // Assemble Add Stock panel.
    addPanel.add(newSymbolTextBox);
    addPanel.add(addStockButton);

    // Assemble Main panel.
    mainPanel.add(stocksFlexTable);
    mainPanel.add(addPanel);
    mainPanel.add(lastUpdatedLabel);

    // TODO Associate the Main panel with the HTML host page.
    // TODO Move cursor focus to the input box.

  }

}

 4。根面板主要面板

为了嵌入在HTML宿主页面的任何GWT部件或面板,它必须包含根面板垂直面板根面板mainPanel中关联根面板包装,有一个stocklistID StockWatcher宿主页面HTML元素在这种情况下它是一个<div>元素

    面板主机通过根面板关联
    onModuleLoad方法取代TODO注释突出显示的代码

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // Create table for stock data.
    stocksFlexTable.setText(0, 0, "Symbol");
    stocksFlexTable.setText(0, 1, "Price");
    stocksFlexTable.setText(0, 2, "Change");
    stocksFlexTable.setText(0, 3, "Remove");

    // Assemble Add Stock panel.
    addPanel.add(newSymbolTextBox);
    addPanel.add(addStockButton);

    // Assemble Main panel.
    mainPanel.add(stocksFlexTable);
    mainPanel.add(addPanel);
    mainPanel.add(lastUpdatedLabel);

    // Associate the Main panel with the HTML host page.
    RootPanel.get("stockList").add(mainPanel);

    // TODO Move cursor focus to the input box.

  }

}

 Eclipse的标志RootPanel建议包括进口报关单

包括进口报关单

import com.google.gwt.user.client.ui.RootPanel;

5。光标焦点移动输入框中

最后,移动光标焦点输入框StockWatcher负载,用户可以开始增加库存

    onModuleLoad方法取代TODO注释突出显示的代码

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // Create table for stock data.
    stocksFlexTable.setText(0, 0, "Symbol");
    stocksFlexTable.setText(0, 1, "Price");
    stocksFlexTable.setText(0, 2, "Change");
    stocksFlexTable.setText(0, 3, "Remove");

    // Assemble Add Stock panel.
    addPanel.add(newSymbolTextBox);
    addPanel.add(addStockButton);

    // Assemble Main panel.
    mainPanel.add(stocksFlexTable);
    mainPanel.add(addPanel);
    mainPanel.add(lastUpdatedLabel);

    // Associate the Main panel with the HTML host page.
    RootPanel.get("stockList").add(mainPanel);

    // Move cursor focus to the input box.
    newSymbolTextBox.setFocus(true);

  }

}

 摘要

这里你做了什么,这点

5。测试布局

Ajax应用开发GWT使用一个好处,你可以看到代码更改的影响只要你刷新托管模式浏览所以,你可以看到变化无论您是开发或调试Eclipse中在调试模式下运行StockWatcher然后你就可以Java和Debug透视图之间切换,而无需重新启动StockWatcher

    保存编辑过的文件
    保存StockWatcher.java
    在托管模式下启动StockWatcher
    Eclipse菜单栏中选择Run> Debug
    如果你不使用Eclipse,进入命令行ant host
    托管模式浏览显示StockWatcher应用程序第一次迭代


    StockWatcher建设中的UI元素
    StockWatcher显示的Flex头,输入框和“添加”按钮您还没有设置标签的文本,但如此,它不会显示你会做到这一点后,已经实现了股票刷新机制
    保留在托管模式下运行StockWatcher
    本教程其余部分你会经常测试在托管模式下变化

刷新托管模式

你并不总是需要修改源代码重新启动后,在托管模式下应用相反,只要按一下托管模式浏览的“刷新”按钮保存您的更改托管模式会自动重新编译应用程序并打开新的版本

最佳实践:您可能会注意到您所做的更改生效,有时即使你不刷新托管模式此行为是一种托管模式下编译的代码交互的方式结果,但它并不总是可靠的具体来说,它只有当你对现有功能轻微变化确保变化,使一个习惯,总是刷新更改后托管模式浏览

下一步是什么

在这一点上你已经建立了实施GWT小部件和面板StockWatcher基本UI组件部件不响应任何输入

现在你可以在客户端上事件处理代码电线侦听事件部件编写响应这些事件的代码

第4步:管理客户端事件

第4步:管理客户端事件

此时,您已经创建的接口所有元素许多用户界面框架GWT是基于事件的意味着响应某些事件发生执行的代码大多数情况下,该事件由用户触发使用鼠标或键盘进行交互的应用程序界面

在本节中,你会连接你的部件,听取和处理鼠标和键盘事件

    审查的功能要求。
    侦听事件
    对事件作出响应
    测试事件处理

1。回顾事件处理的要求

让我们回顾一下StockWatcher要求,看看有什么事件发生
任务UI事件触发机制响应
用户输入一个股票代码单击“添加按钮
或按返回在输入框中

    验证输入
    请检查如果股票已经存在
    添加一个新行
    创建一个删除按钮

用户删除表中股票按下删除“按钮

    删除

GWT提供了不同的事件处理程序接口要处理添加和删除按钮单击事件,你会使用对clickHandler接口处理键盘在输入框中事件,你会使用KeyPressHandler接口

与GWT1.6开始对clickHandlerKeyDownHandlerKeyPressHandlerKeyUpHandler接口取代现在已经过时ClickListenerKeyBoardListener接口

2。监听事件
事件处理程序接口

在GWT事件使用事件处理程序接口模式类似其他用户界面框架订阅一个事件你传递一个特定事件处理程序接口,以适当的部件事件处理程序接口定义一个或多个方法部件,然后调用公布(发布)的事件
处理鼠标事件

StockWatcher用户可以输入股票代码方法之一通过用鼠标点击“添加”按钮

将处理传递给它的对象实现对clickHandler接口添加按钮的Click事件在这种情况下,你会使用一个匿名内部类来实现ClickHandler在部件上用户点击对clickHandler接口有一个方法的onClick其中火灾

用户点击添加按钮StockWatcher应该响应加入股票库存表因此,要处理单击事件,调用addStock方法你有没有addStock方法您将创建一个存根,然后下一节代码

    “添加”按钮添加事件处理程序因此它可以接收click事件
    Stockwatcher.javaonModuleLoad方法剪切和粘贴的代码说:“”添加“按钮鼠标事件下面就是突出
    Eclipse的标志ClickHandler建议包括进口报关单
    包括ClickHandlerClickEvent进口报关单
    Eclipse的标志addStock
    StockWatcher.java创建addStock方法存根
    选择Eclipse快捷方式创建类型'StockWatcher'方法addStock或复制粘贴代码如下。
    注:根据Eclipse配置,它可能会创建一个受保护的访问修饰符addStock方法你是不是子类StockWatcher所以以后当你实施addStock方法你会改变其进入私人

package com.google.gwt.sample.stockwatcher.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();

  /**
   * Entry point method.
   */
  public void onModuleLoad() {
    // Create table for stock data.
    stocksFlexTable.setText(0, 0, "Symbol");
    stocksFlexTable.setText(0, 1, "Price");
    stocksFlexTable.setText(0, 2, "Change");
    stocksFlexTable.setText(0, 3, "Remove");

    // Assemble Add Stock panel.
    addPanel.add(newSymbolTextBox);
    addPanel.add(addStockButton);

    // Assemble Main panel.
    mainPanel.add(stocksFlexTable);
    mainPanel.add(addPanel);
    mainPanel.add(lastUpdatedLabel);

    // Associate the Main panel with the HTML host page.
    RootPanel.get("stockList").add(mainPanel);

    // Move cursor focus to the input box.
    newSymbolTextBox.setFocus(true);

    // Listen for mouse events on the Add button.
    addStockButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        addStock();
      }
    });

  }

  /**
   * Add stock to FlexTable. Executed when the user clicks the addStockButton or
   * presses enter in the newSymbolTextBox.
   */
  private void addStock() {
    // TODO Auto-generated method stub

  }

}

 实现注意:对于规模较小应用,如StockWatcher处理事件相对较少使用匿名内部类得到用最少的代码做的工作不过如果你有大量订阅事件事件处理程序这种方法可以是低效的,因为它可能导致创建许多单独事件处理程序对象这种情况下,最好有一个类实现事件处理程序接口和处理来自多个事件出版商事件您可以通过调用getSource()方法区分事件源这使得更好利用内存但需要稍微代码有关代码示例,请参阅开发人员指南活动和处理

处理键盘事件

除了使用“添加”按钮StockWatcher用户可以输入股票代码而不考虑他们的手从键盘上在输入框中返回

订阅键盘事件,你可以调用addKeyPressHandlerKeyPressHandler方法传递给它一个KeyPressHandler

    挂钩KeyPress事件处理程序输入框newSymbolTextBox
    onModuleLoad方法剪切和粘贴代码评论说:“听着键盘事件在输入框中。”下面就是突出

// Listen for mouse events on the Add button.
    addStockButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        addStock();
      }
    });

    // Listen for keyboard events in the input box.
    newSymbolTextBox.addKeyPressHandler(new KeyPressHandler() {
      public void onKeyPress(KeyPressEvent event) {
        if (event.getCharCode() == KeyCodes.KEY_ENTER) {
          addStock();
        }
      }
    });

  }

  /**
   * Add stock to FlexTable. Executed when the user clicks the addStockButton or
   * presses enter in the newSymbolTextBox.
   */
  private void addStock() {
    // TODO Auto-generated method stub

  }

}

 Eclipse的标志KeyPressHandler建议包括进口报关单

包括进口报关单

import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;

 事件处理程序,现在有线事件准备你的下一步是填写存根addStock方法

3。响应用户事件

此时,StockWatcher倾听用户输入信号用户输入一个股票代码鼠标或键盘事件所以接下来,您将测试事件处理程序接口是否是由编码StockWatcher当它检测到一个事件响应工作添加股票 StockWatcher响应客户端上没有任何请求发送回服务器重新加载HTML页面

股票添加库存表

StockWatcher用户将进入股票他们要监控到输入框一次股票代码当他们按Enter或单击“添加”按钮,你想StockWatcher答复如下

    验证输入
    检查重复
    新增的股票
    添加一个按钮从列表中删除的股票

在本节中你会第一个响应代码验证输入只是为了看看如果事件处理程序接口工作在下一节中客户端功能进行编码代码其余的步骤添加股票

addStock方法将实现此功能。

验证输入在文本框中

你想验证输入股票代码是有效的而非验证用户输入是否符合实际股票代码,本教程的目的你只需执行一个简单的字符有效性检查

首先提取股票代码在TextBox部件检索文本使用getText方法

接下来,确保charcters不是指定非法字符当你转换的用户输入,以标准的形式使用正则表达式来检查它的格式记住使用具有相同的含义在Java和JavaScript正则表达式

如果输入的是有效的,清晰的文本框,使用户可以添加其他股票代码

最后,如果输入的是无效的,用户通过一个对话框警告

    验证用户输入股票代码
    StockWatcher.java替换下面的代码存根addStock方法

private void addStock() {
    final String symbol = newSymbolTextBox.getText().toUpperCase().trim();
    newSymbolTextBox.setFocus(true);

    // Stock code must be between 1 and 10 chars that are numbers, letters, or dots.
    if (!symbol.matches("^[0-9A-Z\\.]{1,10}$")) {
      Window.alert("'" + symbol + "' is not a valid symbol.");
      newSymbolTextBox.selectAll();
      return;
    }

    newSymbolTextBox.setText("");

    // TODO Don't add the stock if it's already in the table.

    // TODO Add the stock to the table.

    // TODO Add a button to remove this stock from the table.

    // TODO Get the stock price.

  }

 Eclipse的标志窗口,并建议包括进口报关单

包括进口报关单

import com.google.gwt.user.client.Window;

4。测试事件处理

此时你应该能够在输入框中输入文字如果您使用非法字符一个对话框弹出并显示警告试试看

    在托管模式下测试事件处理。
    点击已经打开托管模式浏览器
    “刷新”。
    测试这两个事件处理程序接口工作
    在输入框中输入股票代码输入使用这两种方法通过按回车键用鼠标点击“添加”按钮
    在这一点上,股票是不能添加到表中然而,输入框应该清楚让你可以添加其他股票
    测试的有效性检查错误消息
    做出一些错别字,包括非法字符

提示:你的Java代码所做更改会立即显示托管模式浏览如果您已经有托管模式浏览器中打开你不需要重新启动它。只需点击工具栏上的“刷新”按钮重新载入更新GWT代码

虽然你没有编译StockWatcher,你可以在这里测试在Web模式下运行StockWatcher

下一步是什么

在这一点上已经实现了信号用户已经进入了一个股票鼠标和键盘事件事件处理程序接口 Stockwatcher响应验证输入

现在,您可以执行的代码在客户端上,增加了股票,并提供一个按钮来删除它您还可以显示股票价格和显示数据显示数据时,最后更新时间戳

第5步:编码客户端功能

此时,已经建立了GWT小部件和面板用户界面事件处理程序有线 StockWatcher接受输入尚未添加股票股票或更新任何库存数据

在本节中,您将完成实施所有StockWatcher客户端功能具体来说,您将编写代码以下内容:

    添加和删除库存表股票
    刷新表中的每个股票价格变化领域
    实现时间戳显示最后更新时间

初步StockWatcher实现是很简单的您的代码在客户端功能稍后,您将添加调用到服务器,以获取股票数据

1。添加和删除库存表股票

你的第一个任务股票代码和一个删除按钮添加股票记住FlexTable自动调整来保存数据,所以你不必担心编写代码来处理

    创建一个数据结构
    库存表添加
    添加一个按钮,删除库存表股票
    在托管模式下进行测试

1。创建一个数据结构

你需要一个数据结构来保存用户输入的股票符号列表使用标准的Java ArrayList和致电名单上的股票

    创建一个数据结构
    StockWatcher.javaStockWatcher创建一个JavaArrayList一个新实例

public class StockWatcher implements EntryPoint {

  private VerticalPanel mainPanel = new VerticalPanel();
  private FlexTable stocksFlexTable = new FlexTable();
  private HorizontalPanel addPanel = new HorizontalPanel();
  private TextBox newSymbolTextBox = new TextBox();
  private Button addStockButton = new Button("Add");
  private Label lastUpdatedLabel = new Label();
  private ArrayList<String> stocks = new ArrayList<String>();

 2。到Flex添加

在用户输入一个股票代码第一次检查,以确保没有重复如果不存在的股票代码添加一个新行FlexTable填充用户输入股票符号在第一列单元文本添加到一个细胞FlexTable调用setText方法

    检查的股票,看它是否存在如果这样做,不添加再次
    addStock方法取代与此代码TODO注释

// Don't add the stock if it's already in the table.
    if (stocks.contains(symbol))
      return;

如果股票不存在,添加它。
addStock方法取代与此代码TODO注释

 // Add the stock to the table.
    int row = stocksFlexTable.getRowCount();
    stocks.add(symbol);
    stocksFlexTable.setText(row, 0, symbol);

当您呼叫setText方法FlexTable自动创建新的细胞需要,因此,您不需要明确地调整

3。添加一个按钮,库存清单删除股票

使用户可以从列表中删除一个特定的股票表行最后一个单元格插入一个删除“按钮添加一个部件一个细胞FlexTable调用setWidget方法订阅点击事件addClickHandler方法如果删除股票按钮出版的click事件,请从FlexTableArrayList的股票

    添加按钮从列表中删除的股票
    addStock方法取代与此代码TODO注释

 // Add a button to remove this stock from the table.
    Button removeStockButton = new Button("x");
    removeStockButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        int removedIndex = stocks.indexOf(symbol);
        stocks.remove(removedIndex);
        stocksFlexTable.removeRow(removedIndex + 1);
      }
    });
    stocksFlexTable.setWidget(row, 3, removeStockButton);

 4。测试添加/删除股票的功能

多了一个“TODO代码获得的股票价格但是,首先一个在托管模式下快速检查,看看如果加上股票删除股票的功能按预期工作

此时当你输入一个股票代码StockWatcher应该把它添加库存表试试看

    在托管模式下运行StockWatcher
    点击已经打开托管模式浏览器
    “刷新”。
    新增股票
    在输入框中输入股票代码
    StockWatcher股票添加到表中。该表大小举行新的数据然而,价格和变化领域仍然是空的如果你输入股票代码以小写字母转换为大写
    验证,你不能向表中添加重复的股票
    新增股票代码中已存在的
    StockWatcher清除输入框不能添加相同股票代码
    删除的股票
    点击“删除”按钮
    该公司股价从表中删除调整大小

2。刷新价格变化领域

StockWatcher最重要的功能是更新用户正在看的股票价格。如果你正在编写StockWatcher使用传统的Web开发技术,你必须依靠完整的页面重载每次你想更新的价格。你可以做到这一点无论是手动(用户点击浏览器的刷新按钮)或自动(例如,使用一个<meta http-equiv="refresh" content="5">在HTML标题标签)。但在这个Web 2.0的时代,根本就没有足够的效率。 StockWatcher的用户希望他们的股票价格更新,他们希望他们现在无需等待一整页刷新...。

在本节中,你会:

    
自动刷新的价格和实施一个计时器,并指定刷新率改变的领域。
    
封装创建一个类,StockPrice的股票数据。
    
价格和变化领域实施refreshWatchList方法产生随机的股票数据。
    
与实施updateTable方法的股票数据加载的价格和变化领域。

1。自动刷新股票数据

GWT使得它容易更新应用程序的内容上飞。 StockWatcher,您将使用GWT的Timer类自动更新股票价格。

定时器是一个单线程的,浏览器的安全计时器类。它使您可以安排在未来的某个点运行的代码,无论是使用schedule()方法或反复使用scheduleRepeating()方法。因为你想StockWatcher自动更新股票价格,每五秒钟,你会使用scheduleRepeating()。

当定时器触发,在run方法执行。 StockWatcher你将覆盖刷新价格和变化领域的refreshWatchList方法的调用run方法。现在,只要把refreshWatchList方法存根;在本节后面,你会实现它。

    
实现定时器。
    
修改onModuleLoad方法创建一个新的定时器实例,如下:

  public void onModuleLoad() {

    ...

    // Move cursor focus to the text box.
    newSymbolTextBox.setFocus(true);

    // Setup timer to refresh list automatically.
    Timer refreshTimer = new Timer() {
      @Override
      public void run() {
        refreshWatchList();
      }
    };
    refreshTimer.scheduleRepeating(REFRESH_INTERVAL);

    ...

  }

 Eclipse的标志定时器REFRESH_INTERVALrefreshWatchList
声明定时器进口
如果您使用的是Eclipse的快捷方式一定要选择GWT计时器

进口com.google.gwt.user.client.Timer;

指定的刷新率
如果您使用的是Eclipse的快捷方式,选择创建常量'REFRESH_INTERVAL然后指定刷新间隔(以毫秒为单位),5000
否则,只是剪切粘贴下面突出显示的代码

公共StockWatcher实现的EntryPoint{

  私有静态最后INT REFRESH_INTERVAL=5000;// MS
  私人VerticalPanel mainPanel中=VerticalPanel();
    

填充尽快添加一个新的股票价格变化
addStock方法突出显示的代码替换TODO注释

private void addStock() {

    ...

    // Add a button to remove a stock from the table.
    Button removeStockButton = new Button("x");
    removeStockButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        int removedIndex = stocks.indexOf(symbol);
        stocks.remove(removedIndex);
        stocksFlexTable.removeRow(removedIndex + 1);
      }
    });
    stocksFlexTable.setWidget(row, 3, removeStockButton);

    // Get the stock price.
    refreshWatchList();

  }
    

 Eclipse的标志refreshWatchList
StockWatcher创建一个存根refreshWatchList方法

private void refreshWatchList() {
    // TODO Auto-generated method stub

  }

 

使用Eclipse创建一个Java类

让您在Java语言编写应用程序的主要方式GWT的速度AJAX开发正因为如此,你可以利用静态类型检查经过时间考验的,当它现代IDE功能代码完成和自动重构结合面向对象编程模式优势使其比以往任何时候都更容易编写健壮AJAX应用程序具有良好的组织代码库。

StockWatcher你会采取这种能力保理自己的类股票价格数据优势

    创建一个新的Java类名为StockPrice
    在Eclipse中,在Package Explorer窗格选择com.google.gwt.sample.stockwatcher.client
    Eclipse菜单栏中选择文件>新建>
    Eclipse中打开一个新Java类窗口
    填写在新类的窗口
    名称输入StockPrice
    接受其他字段的默认值
    按Finish

替换下面的代码

package com.google.gwt.sample.stockwatcher.client;

public class StockPrice {

  private String symbol;
  private double price;
  private double change;

  public StockPrice() {
  }

  public StockPrice(String symbol, double price, double change) {
    this.symbol = symbol;
    this.price = price;
    this.change = change;
  }

  public String getSymbol() {
    return this.symbol;
  }

  public double getPrice() {
    return this.price;
  }

  public double getChange() {
    return this.change;
  }

  public double getChangePercent() {
    return 10.0 * this.change / this.price;
  }

  public void setSymbol(String symbol) {
    this.symbol = symbol;
  }

  public void setPrice(double price) {
    this.price = price;
  }

  public void setChange(double change) {
    this.change = change;
  }
}

 3。生成库存数据

现在你有一个StockPrice类来封装股票价格数据,可以产生实际的数据。要做到这一点将实现refreshWatchList方法记住refreshWatchList方法被称为当用户增加股票的库存表然后每隔5秒计时器触发
随机生成数据

代替检索实时股票价格在线数据您将创建伪随机价格变化要做到这一点使用GWTRandom类然后填充这些值StockPrice对象数组并通过他们updateTable方法

    随机生成股票价格
    StockWatcher用下面的代码代替存根refreshWatchList方法

  /**
   * Generate random stock prices.
   */
  private void refreshWatchList() {
    final double MAX_PRICE = 100.0; // $100.00
    final double MAX_PRICE_CHANGE = 0.02; // +/- 2%

    StockPrice[] prices = new StockPrice[stocks.size()];
    for (int i = 0; i < stocks.size(); i++) {
      double price = Random.nextDouble() * MAX_PRICE;
      double change = price * MAX_PRICE_CHANGE
          * (Random.nextDouble() * 2.0 - 1.0);

      prices[i] = new StockPrice(stocks.get(i), price, change);
    }

    updateTable(prices);
  }

 

  1. Include the import declaration.
    import com.google.gwt.user.client.Random;
  2. Create a stub for the updateTable(StockPrice[]) method.
      private void updateTable(StockPrice[] prices) {
        // TODO Auto-generated method stub
    
      }

4。填充价格变化领域

最后,负载随机生成价格改变StockWatcher数据对于每个股票格式价格和变化然后加载数据要做到这一点将实现StockWatcher两种方法

    价格领域格式两个小数位1,956.00
    前缀变化领域一个标志(+/-).

    实现方法updateTableStockPrices[])。
    替换用下面的代码存根

 /**
   * Update the Price and Change fields all the rows in the stock table.
   *
   * @param prices Stock data for all rows.
   */
  private void updateTable(StockPrice[] prices) {
    for (int i = 0; i < prices.length; i++) {
      updateTable(prices[i]);
    }

  }

 Eclipse的标志updateTable
updateTableStockPrice)方法创建一个存根
实现该方法updateTableStockPrice
替换用下面的代码存根

  /**
   * Update a single row in the stock table.
   *
   * @param price Stock data for a single row.
   */
  private void updateTable(StockPrice price) {
    // Make sure the stock is still in the stock table.
    if (!stocks.contains(price.getSymbol())) {
      return;
    }

    int row = stocks.indexOf(price.getSymbol()) + 1;

    // Format the data in the Price and Change fields.
    String priceText = NumberFormat.getFormat("#,##0.00").format(
        price.getPrice());
    NumberFormat changeFormat = NumberFormat.getFormat("+#,##0.00;-#,##0.00");
    String changeText = changeFormat.format(price.getChange());
    String changePercentText = changeFormat.format(price.getChangePercent());

    // Populate the Price and Change fields with new data.
    stocksFlexTable.setText(row, 1, priceText);
    stocksFlexTable.setText(row, 2, changeText + " (" + changePercentText
        + "%)");
  }

 

  1. Eclipse flags NumberFormat.
  2. Include the import declaration.
    import com.google.gwt.i18n.client.NumberFormat;

5。测试随机生成股票价格变化

此时,随机生成数据股票价格变化领域填充试试看

    在托管模式下运行StockWatcher
    新增股票
    价格变化领域应该有数据。
    每5秒,数据刷新。

3。添加时间戳

您需要实现的功能最后一块的时间戳一个Label部件lastUpdatedLabel创建UI中时间戳现在设置Label窗口小部件文本将此代码添加到updateTableStockPrice[])方法

    实现时间戳
    updateTableStockPrice[])方法,复制和粘贴突出显示的代码

 /**
   * Update the Price and Change fields all the rows in the stock table.
   *
   * @param prices Stock data for all rows.
   */
  private void updateTable(StockPrice[] prices) {
    for (int i = 0; i < prices.length; i++) {
      updateTable(prices[i]);
    }

    // Display timestamp showing last refresh.
    lastUpdatedLabel.setText("Last update : "
        + DateTimeFormat.getMediumDateTimeFormat().format(new Date()));

  }

 Eclipse的标志DateTimeFormat和日期
包括进口

进口com.google.gwt.i18n.client.DateTimeFormat;

进口java.util.Date的;
        

测试时间戳记
保存您的更改托管模式浏览“刷新”。
时间戳标签应显示下方的库存表由于价格变化领域的刷新,时间戳显示最后更新日期和时间

实现注意:您可能已经注意到DateTimeFormat和NumberFormat生活在一个com.google.gwt.i18n分装,这表明他们以某种方式处理与国际化事实上他们做的... ...这两个类会自动使用您的应用程序的区域设置格式化数字和日期您将了解更多有关国际GWT应用程序的教程本地化和翻译成其他语言GWT应用程序

下一步是什么

在这一点上你已经建立了界面组件和编码所有基本客户端StockWatcher应用程序功能用户可以添加和删除的股票价格变化领域更新,每5秒一个时间戳显示上次刷新发生

虽然你没有编译StockWatcher,你可以在这里测试在Web模式下运行StockWatcher
一个Bug

为了本教程中我们引入代码错误。你能发现

变化的百分比不要他们似乎有点小如果做数学题,你会发现他们似乎完全是一个量级小于他们算术错误躲藏StockWatcher代码某处使用GWT和您的Java IDE提供的工具你的下一个步骤发现和修正错误

第6步:调试GWT应用程序

此时,已经完成了实施StockWatcher UI和所有客户端功能然而,你已经注意到有一个变化领域错误变化的百分比正确的计算

在本节中将使用Eclipse调试Java代码同时在托管模式下运行StockWatcher

    寻找bug
    修正错误
    在托管模式下运行StockWatcher测试bug修复

优点

您可以调试Java源代码,然后再编译成JavaScriptGWT的develpment过程帮助您您的Java IDE调试工具优势您可以:

    设置断点
    通过一行行代码步骤
    钻取的代码
    检查变量的值
    显示挂起线程堆栈帧

在JavaScript开发景点之一,你可以进行更改没有浏览器一个缓慢编译步骤他们立即通过刷新 GWT的托管模式提供完全相同的开发周期您不必每次进行修改重新编译托管模式下整点只要点击“刷新”看到更新Java代码行动

1。寻找错误
分析问题

价格变化领域的价值观来看你可以看到出于某种原因,所有变化百分比只有1/ 10大小正确的价值观

更改字段的值装入updateTableStockPrice)方法

 /**
   * Update a single row in the stock table.
   *
   * @param price Stock data for a single row.
   */
  private void updateTable(StockPrice price) {
    // Make sure the stock is still in the stock table.
    if (!stocks.contains(price.getSymbol())) {
      return;
    }

    int row = stocks.indexOf(price.getSymbol()) + 1;

    // Format the data in the Price and Change fields.
    String priceText = NumberFormat.getFormat("#,##0.00").format(
        price.getPrice());
    NumberFormat changeFormat = NumberFormat.getFormat("+#,##0.00;-#,##0.00");
    String changeText = changeFormat.format(price.getChange());
    String changePercentText = changeFormat.format(price.getChangePercent());

    // Populate the Price and Change fields with new data.
    stocksFlexTable.setText(row, 1, priceText);
    stocksFlexTable.setText(row, 2, changeText + " (" + changePercentText
        + "%)");
  }

 只是瞥了一眼代码,你可以看到changePercentText变量被设置price.getChangePercent因此,首先在该行设置一个断点,然后向下钻取,以确定其中变化的百分比计算错误
设置断点

    你想步入想要检查变量值的代码行设置一个断点
    StockWatcher.javaupdateTableStockPrice价格的方法这两行设置一个断点

    字符串changePercentText= changeFormat.formatprice.getChangePercent());

    stocksFlexTable.setText(行,1priceText;

    Eclipse交换机Debug透视图
    运行该代码有错误
    运行代码updateTable方法如果您怀疑错误托管模式浏览新增股票股票列表
    在第一个断点会停止执行
    检查变量priceTextchangeText的值
    在Eclipse Debug透视图看看变量窗格
    运行该代码到下一个破发点,priceText设置
    调试窗格“恢复”图标
    检查变量priceTextchangeTextchangePercentText的值
    在Eclipse Debug透视图看看变量窗格如果你喜欢,请仔细检查数学错误

环回的第一个破发点changePercentText设置
调试窗格“恢复”图标

步执行代码

现在步入代码看哪里,以及如何changePercentText正在计算

    进入getChangePercent方法步骤,看看它是如何计算changePercentText价值

public double getChangePercent() {
    return 10.0 * this.change / this.price;
  }

 纵观getChangePercent方法,你可以看到问题它的变化的百分比乘以10不是100完全对应你看到面前输出所有变化百分比分别只有1 / 10大小正确的价值观

2。修复的bug

    修复的错误计算价格变动百分比
    StockPrice.java,编辑getChangePercent方法

 public double getChangePercent() {
    return 100.0 * this.change / this.price;
  }

 提示:在Eclipse中,如果你发现它更容易在Java透视图编辑,而不是Debug透视图可以来回切换,而在调试模式下运行StockWatcher

3。在托管模式下测试bug修复

在这一点上当你输入一个股票代码变化领域计算应准确试试看

    在Eclipse中,切换所有断点,然后按恢复
    托管模式浏览“刷新”。
    新增股票
    检查变化领域价值计算

下一步是什么

在这一点上你实现你所有的功能要求 StockWatcher正在运行,并且你发现修正了一个错误

现在,你愿进一步加强StockWatcher视觉设计将应用CSS样式规则GWT小部件并添加一个静态元素徽标)页面

7应用样式

在这一点上StockWatcher功能现在,你想给它一些视觉风格

对CSS优点

GWT提供了很少Java方法直接相关的样式相反,我们鼓励你定义层叠样式表样式

当谈到样式的Web应用程序,CSS是理想选择。除了干净地应用程序逻辑分离出来风格这种分工有助于应用程序的负载提供更迅速占用更少的内存甚至使它们更容易编辑/调试周期调整,因为没有需要重新编译的风格调整

1。项目相关样式表

两个样式表已经StockWatcher项目相关的

    主题样式表standard.cssGWT的默认样式定义
    应用样式表StockWatcher.css定义StockWatcher的具体样式

当您使用webAppCreator创建StockWatcher它创建应用程序样式表(StockWatcher.css它还引用GWT模块主题

    打开GWT模块StockWatcher/ SRC/ COM/谷歌/ GWT/样本/ stockwatcher/ StockWatcher.gwt.xml注意默认使用标准的主题是




posted @ 2011-11-22 15:58  skyme  阅读(1976)  评论(0编辑  收藏  举报