2011年10月22日土曜日

SVNWCClientの利用方法

SVNkitの使用方法がよく分からず今までよく知らなかったのだけど、

SVNWCClientあたりにというクラスを利用すると、SVNクライアントと
同じような操作ができるということを知った。

例えば、最新のSVNの最終更新者を表示する場合には、下記のような感じで
書けばいける。



SVNInfo info = client.doInfo(new File(filePath),SVNRevision.HEAD);
SVNWCClient client = new SVNWCClient((ISVNAuthenticationManager)null,null);
System.out.println(info.getAuthor());

他にもSVNBasicClientあたりを継承しているクラスを利用すると他にも
いろいろなことができそうな感じです。
http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/wc/SVNBasicClient.html


今度いろいろと試してみることにしよう。

ちなみに、現在のSVNKit (1.3.6.1)では、まだSubversion 1.7.0には未対応で
現在開発中とのこと。

http://svnkit.com/download.php

11月にリリース予定とのことなので、こちらも対応したら試してみようと思う。


2011年7月26日火曜日

GWTでURLのパラメータの取得

GWTでURLのパラメータの取得ってどうやるのかと
調べていたら意外に簡単に出来ることがわかった。


Window.Locationというクラスを利用すれば出来る。

Location.getParameter(”val”)

と書けば、

http://hoge/?val=xxxx

というようなURLのvalの値を取得することが出来る。

2011年7月25日月曜日

GWTのログ機能

GWTにはログ機能がある。
それをいじってみた。
本家のドキュメントはこちら。

http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html


java.util.loggingクラスをエミュレートしたログクラスが用意されており、
クライアント側、サーバ側の両方にログを出力することが出来るようです。

手順は簡単で、下記の2ポイントだけ。

.gwt.xmlファイルに下記の記述の追加。

<inherits name="com.google.gwt.logging.Logging"/>

 <set-property name="gwt.logging.logLevel" value="SEVERE"/>
 <set-property name="gwt.logging.enabled" value="FALSE"/> 
 <set-property name="gwt.logging.consoleHandler" value="DISABLED"/>


ログハンドラの種類は、
SystemLogHandler
DevelopmentModeLogHandler
ConsoleLogHandler
FirebugLogHandler
PopupLogHandler
SimpleRemoteLogHandler
などがあり、必要に応じてENABLE,DISABLEを設定する。


ソースには、通常の java.util.loggingクラスを利用した方法と同様に記述
 Logger logger = Logger.getLogger("NameOfYourLogger");
 logger.log(Level.SEVERE, "ログ");


SimpleRemoteLogHandler をENABLEにするとサーバ側にログが記録されるようになる。

これをこのまま実行するとサーブレットが定義されていないというようなエラーが
出てしまうので、web.xmlにログ記録用のサーブレットを定義しておく必要がある。

< servlet >
< servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl </servlet-class > 
< servlet-name >logger < /servlet-name >
< /servlet >
< servlet-mapping >
< servlet-name>logger </servlet-name >
< url-pattern>/(ここは、環境によって変更する)/remote_logging </url-pattern >
< /servlet-mapping >

2011年7月16日土曜日

Javaで件数に上限のあるキャッシュの作成

Javaで件数に上限のあるキャッシュの作成ってどうやるのが普通なんだろうと
いろいろ調べてみる。
LinkedHashMapを利用するとすごく簡単にFIFOタイプLRUタイプのキャッシュが
簡単に出来ることがわかった。

FIFO…最初に入ったやつ(古いものから追い出す)タイプ
LRU…一番最後に利用されたものから追い出すタイプ

こんな簡単に実装できるとはびっくりした。

下記がサンプルです。

import java.util.LinkedHashMap;
import java.util.Map.Entry;

public class CacheSample {

 private static class FIFOCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public FIFOCache(int maxEntries) {
    super(maxEntries,(float) 0.75,false);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 private static class LRUCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public LRUCache(int maxEntries) {
    super(maxEntries,(float) 0.75,true);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 public static void main(String[] args) {
  System.out.println("FIFOの場合");
  //上限50個のFIFOキャッシュを作成
  FIFOCache<Integer,String> fifocache = new FIFOCache<Integer,String>(50);
  testCache(fifocache);
  System.out.println("LRUの場合");
  //上限50個のLRUキャッシュを作成
  LRUCache<Integer,String> lrucache = new LRUCache<Integer,String>(50);
  testCache(lrucache);

 }
 private static void testCache(LinkedHashMap<Integer,String> cache) {
  for (int i=0;i<50;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  System.out.println(cache.get(new Integer(0)));
  for (int i=50;i<70;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  if (cache.containsKey(new Integer(0))){
   System.out.println("0が残っている");
  }else{
   System.out.println("0が消えている");
  }  
 }
}

2011年7月2日土曜日

GWTで外部リンクを張る処理の記述方法

GWTでリンクを張る場合に、HyperLinkとかいうクラスを使うのかな
と思ってみてみたけど、どうやらこれではないようでした。

http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/Hyperlink.html

一応、下記のページを参考にしながら方法を書いてみる。

http://code.google.com/webtoolkit/doc/latest/DevGuideSecuritySafeHtml.html

まず、最初に、SafeHtmlTemplates を継承した下記のようなクラスを作成する。
これにより、htmlを返す

 public interface LinkHtmlTemplates extends SafeHtmlTemplates {
     @Template("<a href=\"{0}\"  target=\"_blank\">{1}</a>")
     SafeHtml makeLinkHtml(String url, String linkText);
   }


次に、下記のような記述でkオブジェクトの生成をする。

 private static final LinkHtmlTemplates LINK_TEMPLATES =
       GWT.create(LinkHtmlTemplates.class);

そんで、これを使って、下記のような感じでSafeHtmlを生成する。


 SafeHtml ihtml = LINK_TEMPLATES.messageWithLink(getBTSUrl(numPart), numPart);
 sb.append(ihtml);

こんな感じで書くと、リンクを張るようなものができました。

2011年6月25日土曜日

GWTのCellBrowserを使ってみる

GWTのCellBrowserを始めて使ってみる。
これは、階層構造のデータをツリー風に表示するときに便利。

こんな感じに動作するコンポーネントです。

http://gwt.google.com/samples/Showcase/Showcase.html#!CwCellBrowser

まずは、これを理解するためには、Javadocに書かれているサンプルを
動かすのが一番いいと思う。

http://google-web-toolkit.googlecode.com/svn/javadoc/2.3/com/google/gwt/user/cellview/client/CellBrowser.html

ここでのポイントは、getNodeInfoの記述です。


ここに、選択されたときに次の階層に何を表示するかというのを記載します。


valueがnullの時は第一階層というのもポイント。


もう一つのポイントが、



public boolean isLeaf(Object value) 
という部分。これが最後の階層かどうかというのを返してあげます。


ただ、この例では、最初のCellBrowserをnewした時には第一階層が決定していないと
いけません。

また、通常の場面では、クリックしたときに下位階層のデータを取得して
表示したいというような場合があると思いますが、その場合には、サンプルの


ListDataProvider


というのを利用する代わりに

AsyncDataProvider

というのを利用することになります。

こいつを使うと非同期でデータを取得し終わった後に、

updateRowCount(int size, boolean exact)

updateRowData(int start, java.util.List values)

を呼び出してあげることにより、CellBrowserにデータが非同期表示されるようになります。

AsyncDataProviderのサンプルもJavadocが参考になった。

http://google-web-toolkit.googlecode.com/svn/javadoc/2.3/com/google/gwt/view/client/AsyncDataProvider.html


このサンプルでは、RPCの部分を仮想的に書いているのでやや分かりにくいかもしれないけども
ポイントは、


updateRowData(start, newData);
の部分でリストを更新しているということになります。

2011年5月31日火曜日

httpのPOSTなどを投げることができるツール

RESTなどのWebサービスをためしに
使ってみようというときなんかに、

HttpのPOSTメソッドを投げたいことが投げたいことがある。

そんなときに便利なツールがあったのでメモ。

紹介記事
http://www.moongift.jp/2007/12/restclient/

ツール本体
http://code.google.com/p/rest-client/

使いやすくてなかなか便利です。

2011年5月19日木曜日

autoitでキー操作を書くときのメモ

autoitでエンターキーとかを送るのをどうやって書くのかを
すぐに忘れてしまうので、リンクをメモしておきます。

send関数の使い方。

2011年5月12日木曜日

eclipseのログを見る方法メモ

eclipse自体の挙動がおかしいときに、eclipseのログを見たいときがある
そんな場合のメモ。

そんなときは、eclipsec.exeを利用して下記のような感じで起動すると
ログが出るようになります。

eclipsec.exe -debug -consoleLog



2011年5月10日火曜日

GWTのDialogBoxの横幅が広がらない

GWTのDialogBoxの横幅が400以上に広がらなくて困ったときの試行錯誤メモ。

プログラム内で、

setSize("710px", "280px");
setWidth

としても広がらなくてなんでだろうと思ったのだけど。

どうやら、デフォルトで設定されるスタイルシートに400pxというサイズが
記述されているために、広がらなかった模様です。


こちらの値を書き換えることにより、正しく広がって表示できるようになった。

DialogBoxでsetGlassEnabledが効かない

DialogBoxでsetGlassEnabledが効かなくて困ったので
ちょっと試行錯誤してみた。
(本日時点の最新バージョンであるgwt2.3でためした。)


うまく動作するコード(サンプルコード)とそうでないコード(自分のコード)を比較すると、
center()の位置に違いがあった。

とりあえず、center()を最後に書くとうまく動作してくれた。


//うまく効かない例
center();

  setGlassEnabled(true);
setAnimationEnabled(true);
//setSize("610px", "280px");

//うまく効く例

  setGlassEnabled(true);
setAnimationEnabled(true);
//setSize("610px", "280px");
center();


GWTで円グラフを使う


GWTでグラフを使う場合のメモ

とりあえず、3つくらい目に付いたのでメモ。


extGWT(かっこいい。Flashを利用している)
http://www.sencha.com/examples/pages/charts/basic.html

Googleが提供するAPI(Flashは利用していない)
http://code.google.com/intl/ja/apis/chart/interactive/docs/gallery.html

ofcgwt(LGPLライセンス。Flashを利用している)
http://code.google.com/p/ofcgwt/

2011年3月28日月曜日

GWTで手動でイベントを発動する。

GWTで手動でイベント処理を実行しようとする場合の方法についてのメモ。

いろいろ調べてみて結果、

というのを使えばいいようです。
サンプルコードは下記のリンクより。


ポイントだけ書くと

class OurChangeEvent extends ChangeEvent {} 

と書いて

 textBox.fireEvent(new OurChangeEvent()); 

と書くと、OnChangeイベントが呼び出せるという感じです。

2011年3月9日水曜日

GWTでTextBoxの横にPopUpを出すサンプル

テキストボックスの横にポップアップを出してみる。

こんな感じで書けばいけます。


===================================================

     final TextBox tb = new TextBox();
     tb.addKeyPressHandler(new KeyPressHandler() {
      public void onKeyPress(KeyPressEvent event) {
       if (event.getCharCode()==' '){
        MyPopPuPanel pop = new MyPopPuPanel();
        pop.setPopupPosition(tb.getOffsetWidth(), tb.getAbsoluteTop());
        pop.setAutoHideEnabled(true);
        pop.show();
        event.preventDefault();
       }
      }

GWTでセッション管理

GWTにて、サーバがTomcatなどの普通のAPサーバの場合
セッション管理を行う場合のコーディングメモ。
参考にしたのは、下記のページ。

http://code.google.com/p/bastian/source/browse/bastian-buchholz/src/java/de/bastian/server/rpc/RemoteServiceServlet.java?spec=svn202&r=202

ポイントは、getThreadLocalRequestという関数。

getThreadLocalRequest().getSession(true);

Cookieへの追加は

getThreadLocalResponse().addCookie(cookie);

を使うことによってできる。

2011年3月7日月曜日

Vaardinでファイルダウンロード

Vaardinの場合はファイルダウンロードロジックを書こうとすると
すごく簡単に書ける。

GWTの場合には、サーバのロジックとクライアント側のコードを両方書かなくてはいけないが。

例えば、ダウンロードボタンを押すと、サーバ側のファイル(下記の例では、「C:\\Users\\2006.pdf"」)
をダウンロードするという例だと、下記のように書けば完了。

とても簡単にかけていまいます。

package com.example.myufirstvaadin;

import java.io.File;

import com.vaadin.Application;
import com.vaadin.terminal.ExternalResource;
import com.vaadin.terminal.FileResource;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;

public class MyufirstvaadinApplication extends Application {
 @Override
 public void init() {
  Window mainWindow = new Window("Myufirstvaadin Application");
  Label label = new Label("Hello Vaadin user");
  mainWindow.addComponent(label);
  Button dounloadButton = new Button("ダウンロード");
  mainWindow.addComponent(dounloadButton);
  dounloadButton.addListener(new ClickListener() {
   
   /**
    * 
    */
   private static final long serialVersionUID = 1L;

   public void buttonClick(ClickEvent event) {
    event.getButton().getWindow().open(new FileResource(new File("C:\\Users\\2006.pdf"),MyufirstvaadinApplication.this));
   }
  });
  setMainWindow(mainWindow);
 }

}
 

2011年3月5日土曜日

Vaardinのサンプル集

Vaardinのサンプル集。

ここでは、GWTのshowcaseのようにサンプルのコンポーネントと
サンプルに使われているソースコードを見ることができます。

ファイルのアップロードなんかも、GWTよりも簡単にできそう。

最初は、GWTとどこら辺が違うのかがイメージつかなかったけど、
見てみると、確かにいろいろと楽は楽そうです。

http://demo.vaadin.com/sampler

RIAってどれが主流なんだろうか

最近のトレンドであるRIA(リッチインターネットアプリケーション)ってどれが
主流になっていくんだろうか。

最近、個人的に注目し始めたのが、Vaadinというフレームワーク。

その中にこれらのRIAテクノロジの比較が載るっていた。
Vaadinのサイトだから当然ながらVaadinが言いように見えるけど、
確かによくできたフレームワークだと思う。

http://vaadin.com/comparison

実際に動かしてみて感じたことは、GWTとの比較で書いてみると、
GWTは、サーバロジックとクライアントロジックをしっかり分けて
書く必要があるが、vaadinはあまり、境目を意識しなくても
コードがかけてしまうということ。

また、vaardinの場合には、ブラウザでリロードしても直前の
エディットの状態やチェックボックスの状態が保存されたままになっている。
どこで管理してるんだろうか。
セッション管理もフレームワーク側で管理されてる感じ。

また、GWTはコンパイル時にJavaScriptを生成するのに対して、
Vaadinはおそらく、実行時にJavaScriptを生成しているというように見受けられる。
そのせいか、Vaadinは動かした感じ、若干のもっさり感があるような気がする。

ちなみに、下記はVaadinの開発環境をゼロから作成するためのメモ。

1.Tomcatのインストール(実際は、他のものでもいい)
http://tomcat.apache.org/

2.Eclipse IDE for Java EE Developersのインストール
http://www.eclipse.org/downloads/

3.1.のアプリケーションサーバをeclipseに設定。
(Window→Preference→Serverから追加)

4.vaadinプラグインのインストール
http://vaadin.com/eclipse

でできると思います。

ここまで行くと、下記の動画チュートリアルが実行できるようになる。



そして、入門書もきちんとbook形式で公開されている。
http://vaadin.com/book

2011年2月22日火曜日

JavaPrintServiceでページ毎の印刷

先日は、画像を印刷するというのをやってみたのだけど、本日は、
ページ毎に印刷を行うにはどうしたらいいのだろうかとサンプルを参考に書いてみた。

ポイントは、interfaceのPrintableを実装したクラスを作るということ
そして

public int print(Graphics g,PageFormat pf,int pageIndex)

という関数を実装するということでしょうか。

pageIndexを見て、 Printable.NO_SUCH_PAGEを返してあげるまで
印刷が続くという感じでしょう。

というわけで、例によってサンプルプログラム
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jps/spec/appendix_2DPrinterJob.fm.html#997825
を参考にして、

「現在のページ数:」を表示して、四角を印字するというサンプルプログラムです。

途中。プリンタダイアログも出現します。


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.OrientationRequested;

public class Print2DPrinterJob implements Printable {

 public Print2DPrinterJob() {

  PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
  aset.add(OrientationRequested.LANDSCAPE);
  aset.add(new Copies(2));
  aset.add(new JobName("100ページの印刷", null));

  PrinterJob pj = PrinterJob.getPrinterJob();       
  pj.setPrintable(this);
  //プリンタの検索
  PrintService[] services =
   PrinterJob.lookupPrintServices();

  // primoPDFを検索
  int primoIdx=-1;
  for (int i=0;i<services.length;i++){
   if ("PrimoPDF".equals(services[i].getName())){
    primoIdx=i;
   }
  }
  
  if (services.length > 0) {
   System.out.println("選択されたプリンタ: " + services[primoIdx].getName());
   try {
    pj.setPrintService(services[primoIdx]);
    pj.pageDialog(aset);
    if(pj.printDialog(aset)) {
     pj.print(aset);
    }
   } catch (PrinterException pe) { 
    System.err.println(pe);
   }
  }
 }

 public int print(Graphics g,PageFormat pf,int pageIndex) {

  //100ページというのは(Printable.NO_SUCH_PAGE)を返却することで表現する
  if (pageIndex < 100) {
   Graphics2D g2d= (Graphics2D)g;
   g2d.translate(pf.getImageableX(), pf.getImageableY()); 
   g2d.setColor(Color.black);
   g2d.drawString("現在のページ数:"+(pageIndex+1), 250, 250);
   g2d.fillRect(0, 0, 200, 200);
   return Printable.PAGE_EXISTS;         
  } else {
   return Printable.NO_SUCH_PAGE;
  }
 }

 public static void main(String arg[]) {
  new Print2DPrinterJob();
 }
}

2011年2月21日月曜日

JavaPrintServiceで画像の印刷

Javaプログラムによる印刷を実現するためのJavaPrintService
を使ってみた。

最初は、簡単に画像ファイルを印刷するサンプルを実行してみた。

下記のサンプルでは、PrimoPDFを利用して印刷する例になっています。
結構簡単に印刷できました。

参考にしたページはこちら、

http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jps/spec/JPSTOC.fm.html


import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;


public class PrintPNGFileTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  FileInputStream textstream= null;
  try{
   textstream = new FileInputStream("D:\\white.png");
  } catch (FileNotFoundException ffne) {
  }
  if (textstream == null) {
   return;
  }
  // ドキュメントの形式を設定。これはpngファイルの場合
  DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
  PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        //用紙のサイズを指定。
  aset.add(MediaSizeName.ISO_A4);
  aset.add(new Copies(2));
  PrintService[] services =
   PrintServiceLookup.lookupPrintServices(
     flavor,
     aset);  
  System.out.println("プリンタ件数:"+services.length);
  for (int i=0;i<services.length;i++){
   System.out.println(services[i].getName());
  }
  int primoIdx=-1;
  for (int i=0;i<services.length;i++){
   if ("PrimoPDF".equals(services[i].getName())){
    primoIdx=i;
   }
  }
  if (services.length > 0) {
   Doc myDoc = new SimpleDoc(textstream, flavor, null);
   DocPrintJob job = services[primoIdx].createPrintJob();
   try {
    job.print(myDoc, aset);
   } catch (PrintException pe) {
    pe.printStackTrace();
   }
  }
 }

}

2011年2月19日土曜日

GWTでファイルダウンロードのメモ

GWTでファイルのダウンロードロジックを書く場合ってどうやるもんだろうか
といろいろ調べていた時にたどり着いたページが下記のページ


要するに見えないFrameを生成して貼り付けてあげるという感じでしょうか。

一応試しに、下記のような感じで書いてみたら、ダウンロードができた。

Button btnNewButton = new Button("ダウンロード");
     btnNewButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
          //ここには、実際はサーブレットのURLなどを書く
          String fileDownloadURL = "http://hostname/mylog.log"; 
          Frame fileDownloadFrame = new Frame(fileDownloadURL); 
          fileDownloadFrame.setSize("0px", "0px"); 
          fileDownloadFrame.setVisible(false); 
          panel.add(fileDownloadFrame); 
      }
     });


GWTのCellTableを使ってみる

GWTのCellTableを使ってみる。
一覧表形式で表示したいときに便利なコンポーネントかも。

サンプルはこんな感じらしい。

http://gwt.google.com/samples/Showcase/Showcase.html#!CwCellTable

GWTDesignerを使って作る場合には、下記の手順で。

1.CellTableを任意の位置に貼り付ける
2.CellWidgetからTextCulumnを選択し1、のTableに貼り付ける
3.あとは、プロパティを適当にいじって


で、表に入れるときには下記のような感じで書く。


//resultはデータのリスト



cellTable.setRowCount(result.size(), true);
cellTable.setRowData(0, result);

また、メモだけど読み取り中の状態にする場合には、
下記のような感じ

cellTable.setRowCount(0,false); // 処理中みたいになる

//サーバ呼び出しの処理を書いて

cellTable.setRowData(0, result);//処理中解除の状態


2011年2月17日木曜日

GWTのUiBinderを試してみる

DialogBoxのJavaDocを見ているとUiBinderのサンプルが載っていた。




調べてみるとUiBinderとは、xmlファイルにUIの情報などが書かれている。
つまり、Javaソースにコンポーネントの位置情報などを書かなくてすむ
ということなんでしょう。

Delphiで言えばdfm的な役割をするものだと思う。

JavaDocを読んだだけでは使い方がよくわからなかったので、
使い方をメモっておく。

まず、新規作成方法

右クリックメニュよりNew→UiBinder


そこで自動生成されたui.xmlに下記のサンプルを貼り付けてみる。


<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
 xmlns:g="urn:import:com.google.gwt.user.client.ui">
 <ui:style>
  .important {
   font-weight: bold;
  }
 </ui:style>
 <g:DialogBox autoHide="true" modal="true">
   <g:caption><b>Caption text</b></g:caption>
   <g:HTMLPanel>
     Body text
     <g:Button ui:field='cancelButton'>Cancel</g:Button>
     <g:Button ui:field='okButton'>Okay</g:Button>
   </g:HTMLPanel>
 </g:DialogBox>

ソースは下記のような感じ。

ポイントは、uiBinder.createAndBindUi(this)という部分で
上記のxmlファイルからフォームオブジェクトを生成する部分。

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;

public class MyBinderDialog extends Composite  {

 private DialogBox dlg;
 private static MyBinderDialogUiBinder uiBinder = GWT
   .create(MyBinderDialogUiBinder.class);

 interface MyBinderDialogUiBinder extends UiBinder<DialogBox, MyBinderDialog> {
 }

 public MyBinderDialog() {
  dlg=(uiBinder.createAndBindUi(this));
 }
 
 public DialogBox getDialogBox(){
  return dlg;
 }



}

呼び出し側はこんな感じ。

MyBinderDialog db = new MyBinderDialog();
    DialogBox dbox=db.getDialogBox();
    dbox.show();

2011年1月7日金曜日

JavaでThreadLocalを使ってみる

マルチスレッドプログラムにおいて、スレッド毎にpublic staticな変数を作りたい場合
というのがたまにあります。

そんなときに使うのがThreadLocalというクラス。

これを利用すると、スレッド単位でグローバルな変数と言うのを定義できます。

下記がサンプルコード。
スレッド毎に、KeyがIntegerでValueがStringのHashMapを返ししている
様を確認できるサンプルプログラムです。

=====================================

import java.util.HashMap;
import java.util.Map;


public class ThreadLocalTest {
  private static class ThreadHashMap{

      private static ThreadLocal<HashMap<Integer,String>> tl = new ThreadLocal<HashMap<Integer,String>>() {
          protected synchronized HashMap<Integer,String> initialValue() {
              return new HashMap<Integer,String>();
          }
      };

      public static HashMap<Integer,String> get() {
          return tl.get();
      }
  }
  private static class TestThread extends Thread{
   public void run() {
    try {
     for(int i=0;i<5;i++){
      Map<Integer,String> map=ThreadHashMap.get();
      map.put(i, getName());
      sleep(5);
     }
     System.out.println(getName()+":"+ThreadHashMap.get());;
    } catch (Exception e) {
     e.printStackTrace();
    }
   }   
  }
  public static void main(String[] args) throws InterruptedException{
   Thread th=new TestThread();
   Thread th2=new TestThread();
   th.start();
   th2.start();
   
   while(Thread.activeCount()!=1){
    System.out.println("WAIT"+Thread.activeCount());
    Thread.sleep(100);
   }
   System.out.println("END!!!");
  } 
}