2011年8月19日金曜日

ZK:グリッドに追加した最後の行を必ず見えるようにする

Clients.scrollIntoView(component)メソッドを使うことで、親エレメントをスクロールし、指定したエレメントを見えるようにすることができます。 元ネタ
--- zul ---
<window title="動的に追加した最後の行を必ず見えるようにする方法" border="normal"
                     apply="ctrl.MyCtrl" width="350px">
    <grid height="50px">
        <rows id="rows" />
    </grid>
    <button label="行を追加" id="addBtn" />
</window>
--- java ---
public class MyCtrl extends GenericForwardComposer {
    private Rows rows;
    private static int count=0;
    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
    }

    public void onClick$addBtn(){	
        count++;
        Row row =new Row();
        row.appendChild(new Label("new"+count));
        row.setParent(rows);
        Clients.scrollIntoView(row);		
    }
}

2011年8月9日火曜日

Javaコントローラ内でJavaScriptコードをコールする

元ネタ
JavaのコントローラからJavaScriptのコードを実行させることが必要に なるケースがあるかもしれません。 例えばサーバ・プッシュを使い下記の様な処理をする場合が考えられます。
  • サーバ・サイドでイベントを発行する
  • そのイベントは専用のスレッドで操作される
  • そのスレッドの中からなにがしかのJava Script関数をコールしたい
  • こんな時はこんな風に!! Clients.evalJavaScript("alert('Hello World!')); 簡単でしょ?

    --- zul --
    <window title="JavaコントローラからJavaScript関数をコールする" 
           apply="zkexamples.ViewController2"  border="normal" width="350px">
          <button id="btn" label="click"  />                  
    </window>
    
    --- java ---
    public class ViewController2 extends GenericForwardComposer {
        public void onClick$btn(Event event){
            Clients.evalJavaScript("alert('Hello world!');");	
       }
       public void doAfterCompose(Component comp) throws Exception {
            super.doAfterCompose(comp);
        }	
    }
    

    2011年8月1日月曜日

    ZK: JavaScriptからJavaコントローラのメソッドをコールする

    JavaScriptからコントローラ内のJavaメソッドをコールするときは、JavaScript内で親コンポーネントに対しイベントを送り、親コンポーネントのイベントハンドラでコールしたいJavaメソッドを呼び出すようにします。

  • サーバにイベントを送るJavaScript関数

    function callJavaMethod(){
    zAu.send(new zk.Event(zk.Widget.$(this), 'onLinkClicked', 'Parameter'));
    }

    zk.Widget.$(this) => 親コンポーネント(この場合は "rootwindow"を指す)
    'onLinkClicked' => 送出するイベントを処理するコントローラのイベントハンドラメソッド名
    'Parameter' => イベントハンドラへ渡すパラメータ。(オプション)
    ※イベントハンドラ内で Event event を ForwardEventにキャストし
    getOrigin().getData()でパラメータの値を取得できる。



  • JavaScriptから送出されたイベントのイベントハンドラメソッド

    public void onLinkClicked$rootwindow(Event event){
    someJavaMethod();
    }



    --- zul ---
    <window id="rootwindow"
    title="JavaScriptからJavaコントローラのメソッドをコールする" border="normal"
    apply="zkexamples.calljavafromjavascript.ViewController">
    <html><![CDATA[
    <script type="text/javascript">
    function callJavaMethod(){
    zAu.send(new zk.Event(zk.Widget.$(this), 'onLinkClicked', 'Parameter'));
    }
    </script>
    <a href="#" onClick="callJavaMethod();">Click me</a>
    ]]></html>
    </window>


    --- java ---
    public class ViewController extends GenericForwardComposer {

    // JavaScriptからイベントハンドラを経由してコールされるコントローラのメソッド
    private void callMe() {
    alert("Hello JavaScript, this is Java!");
    }

    // コントローラのイベントハンドラ名の最後に親コンポーネント名をつけること忘れないこと!!
    public void onLinkClicked$rootwindow(Event event){
    ForwardEvent fevent = (ForwardEvent)event;
    System.out.println(fevent.getOrigin().getData());
    callMe();
    }
    }