在GWT StockExchange中, 我们将使用所有基本的小部件, 面板和布局来使用名为Stock Exchange的Google Web Toolkit设计Web应用程序。
这个程序可以用来添加股票市场的内容, 它的价值在一定时间间隔后会改变。将要计算的值是“价格”, 然后是“更改”, 还可以选择删除内容。
面板和小部件的使用如下:
- HTML面板
- 弹性桌
- 流量面板
- 小时
- StockExchange.gwt.xml GWT模块定义
- StockExchange.html主机页面
- StockExchange.css应用程序样式表
- web.xml Java Web应用程序描述符
- StockExchange.java GWT入口点类
- GreetingService.java, GreetingServiceAsync.java, GreetingServiceImpl.java GWT示例RPC类
- gwt-servlet.jar GWT服务器运行时库
- 用于Exchange的StockExchangeTest.java入门测试用例
<
!doctype html>
<
!-- The DOCTYPE declaration above will set the-->
<
!-- browser's rendering engine into-->
<
!-- "Standards Mode". Replacing this declaration-->
<
!-- with a "Quirks Mode" doctype is not supported. -->
<
html>
<
head>
<
meta http-equiv="content-type" content="text/html;
charset=UTF-8">
<
!---->
<
!-- Consider inlining CSS to reduce the number of requested files -->
<
!---->
<
link type="text/css" rel="stylesheet" href="http://www.srcmini.com/StockExchange.css">
<
!---->
<
!-- Any title is fine-->
<
!---->
<
title>
Stock Exchange<
/title>
<
!---->
<
!-- This script loads your compiled module.-->
<
!-- If you add any GWT meta tags, they must-->
<
!-- be added before this line.-->
<
!---->
<
script type="text/javascript" language="javascript" src="http://www.srcmini.com/stockexchange/stockexchange.nocache.js">
<
/script>
<
/head>
<
!---->
<
!-- The body can have arbitrary html, or-->
<
!-- you can leave the body empty if you want-->
<
!-- to create a completely dynamic UI.-->
<
!---->
<
body>
<
h1>
Stock Exchange<
/h1>
<
div id="stockList">
<
/div>
<
iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;
width:0;
height:0;
border:0">
<
/iframe>
<
!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
<
noscript>
<
div style="width: 22em;
position: absolute;
left: 50%;
margin-left: -11em;
color: red;
background-color: white;
border: 1px solid red;
padding: 4px;
font-family: sans-serif">
Your web browser must have JavaScript enabledin order for this application to display correctly.<
/div>
<
/noscript>
<
/body>
<
/html>
【GWT股票交易所应用程序示例】StockExchange.java
package com.gwt.sample.stockexchange.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.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.Window;
import java.util.ArrayList;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Random;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.i18n.client.DateTimeFormat;
import java.util.Date;
/** * Entry point classes define <
code>
onModuleLoad()<
/code>
. */public class StockExchange 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>
();
private static final int REFRESH_INTERVAL = 5000;
// m /*** This is the entry point method.*/ public void onModuleLoad() {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);
// Setup timer to refresh list automatically.Timer refreshTimer = new Timer() {@Overridepublic void run() {refreshWatchList();
}};
refreshTimer.scheduleRepeating(REFRESH_INTERVAL)// 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.addKeyDownHandler(new KeyDownHandler() {public void onKeyDown(KeyDownEvent event) {if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {addStock();
}}});
}/*** Add stock to FlexTable. Executed when the user clicks the addStockButton or* presses enter in the newSymbolTextBox.*/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("");
// Don't add the stock if it's already in the table.if (stocks.contains(symbol))return;
// Add the stock to the table.int row = stocksFlexTable.getRowCount();
stocks.add(symbol);
stocksFlexTable.setText(row, 0, symbol);
// 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);
// Get the stock price.refreshWatchList();
}private void refreshWatchList() {final double MAX_PRICE = 100.0;
// $100.00final 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);
}private void updateTable(StockPrice[] prices) {for (int i = 0;
i <
prices.length;
i++) {updateTable(prices[i]);
}// Display timestamp showing last refresh.DateTimeFormat dateFormat = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM);
lastUpdatedLabel.setText("Last update : " + dateFormat.format(new Date()));
}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+ "%)");
}}
StockPrice.java
package com.gwt.sample.stockexchange.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;
}}
StockExchange.gwt.xml
<
?xml version="1.0" encoding="UTF-8"?>
<
!--When updating your version of GWT, you should also update this DTD reference, so that your app can take advantage of the latest GWT module capabilities.-->
<
!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN""http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<
module rename-to='stockexchange'>
<
!-- Inherit the core Web Toolkit stuff.-->
<
inherits name='com.google.gwt.user.User'/>
<
!-- Inherit the default GWT style sheet.You can change-->
<
!-- the theme of your GWT application by uncommenting-->
<
!-- any one of the following lines. -->
<
inherits name='com.google.gwt.user.theme.clean.Clean'/>
<
!-- <
inherits name='com.google.gwt.user.theme.standard.Standard'/>
-->
<
!-- <
inherits name='com.google.gwt.user.theme.chrome.Chrome'/>
-->
<
!-- <
inherits name='com.google.gwt.user.theme.dark.Dark'/>
-->
<
!-- Other module inherits-->
<
!-- Specify the app entry point class.-->
<
entry-point class='com.gwt.sample.stockexchange.client.StockExchange'/>
<
!-- Specify the paths for translatable code -->
<
source path='client'/>
<
source path='shared'/>
<
!-- allow Super Dev Mode -->
<
add-linker name="xsiframe"/>
<
/module>
输出:
文章图片
文章图片
推荐阅读
- GWT建议框
- GWT StackLayoutPanel用法
- GWT SplitLayoutPanel用法
- GWT滚动面板
- GWT RPC实例
- GWT根面板
- GWT RootLayoutPanel用法
- GWT PopupPanel用法
- GWT面板介绍