gwt的这些特性还是很有意思的,感觉比echo更贴近html, 比如说尺寸等数据,写"20%"和"200px"都可以。echo则尽量封装的象swing, 屏蔽掉html.

anyway, 对于大多数逻辑都在客户端的应用,gwt可以大展身手。比如小游戏~

guess number demo看这里:http://steeven.googlepages.com/MyApp.html
完全在浏览器上运行的玩意,没有写一句js,感觉还是很爽的~

代码如下:
package org.steeven.gwt.test.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * 
@author steeven@gmail.com
 
*/

public class MyApp implements EntryPoint {

    TextBox txtCount 
= new TextBox();

    
private Grid pnlMain;

    
private Button[] numbers = new Button[100];

    
private int target;

    
private int count;

    
private DialogBox box;

    
private Button btnRetry;

    
private Button btnClose;

    
/**
     * This is the entry point method.
     
*/

    
public void onModuleLoad() {
        VerticalPanel pnlStatus 
= new VerticalPanel();
        pnlStatus.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
        pnlStatus.setSpacing(
20);

        txtCount.setEnabled(
false);
        txtCount.setVisibleLength(
10);
        pnlStatus.add(txtCount);
        btnRetry 
= new Button();
        btnRetry.setHTML(
"<img src=\"replay.gif\"/> <u>R</u>etry");
        btnRetry.setAccessKey(
'r');
        btnRetry.addClickListener(
new ClickListener() {
            
public void onClick(Widget sender) {
                doInit();
            }

        }
);
        pnlStatus.add(btnRetry);

        Button btnAbout 
= new Button();
        btnAbout.setHTML(
"<img src='about.gif'/> <u>A</u>bout");
        btnAbout.setAccessKey(
'a');
        btnAbout.addClickListener(
new ClickListener() {
            
public void onClick(Widget sender) {
                doAbout();
            }

        }
);
        pnlStatus.add(btnAbout);

        RootPanel.get(
"status").add(pnlStatus);

        pnlMain 
= new Grid(1010);
        RootPanel.get(
"main").add(pnlMain);

        
for (int i = 0; i < 100; i++{
            numbers[i] 
= new Button();
            numbers[i].setText(i 
+ "");
            numbers[i].addClickListener(
new ClickListener() {
                
public void onClick(Widget sender) {
                    doGuess(sender);
                }

            }
);
            pnlMain.setWidget(i 
/ 10, i % 10, numbers[i]);
        }


        box 
= new DialogBox();
        box.setPopupPosition(
400200);
        btnClose 
= new Button("<u>C</u>lose"new ClickListener() {
            
public void onClick(Widget sender) {
                box.hide();
                doInit();
            }

        }
);
        btnClose.setAccessKey(
'c');
        box.add(btnClose);
        doInit();
    }


    
protected void doGuess(Widget sender) {
        Button btn 
= (Button) sender;
        btnRetry.setEnabled(
true);
        
int n = Integer.parseInt(btn.getText());
        txtCount.setText(
"" + (++count));
        
if (n == target) {
            numbers[n].setEnabled(
false);
            btnClose.setFocus(
true);
            box.clear();
            box
                    .setHTML(
"<center><img src='win.gif'/><h1>YOU WIN!!!</h1><br/><br/><br/>");
            box.add(btnClose);
            box.show();
        }
 else {
            
if (n < target)
                
for (int i = 0; i <= n; i++)
                    numbers[i].setEnabled(
false);
            
else
                
for (int i = n; i < 100; i++)
                    numbers[i].setEnabled(
false);
        }


    }


    
protected void doAbout() {
        box.clear();
        box
                .setHTML(
"<img src='about.gif'/><h1>Guess Number</h1><h3>Google web toolkit test</h3>");
        box.add(btnClose);
        box.show();
    }


    
private void doInit() {
        btnRetry.setEnabled(
false);
        target 
= Random.nextInt(99);
        count 
= 0;
        txtCount.setText(
"0");
        
for (int i = 0; i < 100; i++{
            numbers[i].setVisible(
true);
            numbers[i].setEnabled(
true);
        }

    }


}


第一次玩gwt, 总共花了3个小时,菜呀