YKLook説明書 YKLook用アプリの製作 イベント処理 前へ   次へ
   

イベント処理




イベントを受け取る

以下の例は、ボタンがひとつあり、そのボタンを押すとダイアログウインドウを表示するプログラムです。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        btn = YKLookButton.new( 'ボタン' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( btn )
        yk_add( pan )
        btn.yk_set_listener( 'fn_callback' )
    end
    def fn_callback( prm_event )
        yk_show_dialog_message( nil, '来てます' )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

この例で注目すべきは以下の2箇所です。 yk_set_listener() により、このボタンが押されたときのイベント処理をするためのメソッドを指定します。
このようなイベント処理を一般にコールバックと言います。
ここでは、そのコールバック用メソッドとして fn_callback を指定しています。
そしてそのメソッド定義が 11行目からになります。
コールバック用メソッドの名前はプログラム製作者が自由に考えて付けてください。

コールバック用メソッドには常にひとつの引数があります。
これはイベントの種類によって変わりますが、ボタンの場合は YKLookEventAction クラスのオブジェクトです。
この例のように、引数のイベントオブジェクトを利用しないこともよくあります。

それぞれ詳細は、
で説明していますが、YKLook を初めてお使いになる方は気にせずにこのまま下の項目へお進みください。


イベントを調べる

以下の例は、ボタンが二つあり、ボタンを押すとそのボタンのラベルと同じメッセージをダイアログウインドウに表示するプログラムです。


#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback_1' )
        bt2.yk_set_listener( 'fn_callback_2' )
    end
    def fn_callback_1( prm_event )
        yk_show_dialog_message( nil, 'こんにちは' )
    end
    def fn_callback_2( prm_event )
        yk_show_dialog_message( nil, 'こんばんは' )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

この例1は、前項の例をそのまま二つにコピーしたようなプログラムになっています。
それぞれのボタンごとにコールバック用メソッドを作っています。
下の例2は、コールバック用メソッドの引数を利用しています。


#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback' )
        bt2.yk_set_listener( 'fn_callback' )
    end
    def fn_callback( prm_event )
        btn = prm_event.yk_source()
        msg = btn.yk_text()
        yk_show_dialog_message( nil, msg )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

コールバック用メソッドの処理内容は以下のとおりです。
それぞれ詳細は、
で説明していますが、YKLook を初めてお使いになる方は気にせずにこのまま下の項目へお進みください。


重要: Webアプリとして起動しているときの注意事項です。
上の例1は問題なく動いた。例2も初期表示まではできた。
しかしその後ボタンを押してもダイアログが表示されない。
このような症状が出たときは、YKLook の作業用ディレクトリが確保できていない可能性が高いです。
詳細は 環境設定 > YKLookの作業用ディレクトリ をご覧ください。


タグを付ける

以下の例は、ボタンが二つあり、ボタンを押すとそのボタンのラベルと同じ文字列をテキストフィールドに表示するプログラムです。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        fld = YKLookTextField.new( 20 )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        pan.yk_add( fld )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback' )
        bt2.yk_set_listener( 'fn_callback' )
        fld.yk_set_tag( 'tf20' )              # 注目!
    end
    def fn_callback( prm_event )
        btn = prm_event.yk_source()
        msg = btn.yk_text()
        fld = yk_look( 'tf20' )               # 注目!
        fld.yk_set_text( msg )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

ここでの注目点は以下の2箇所です。
yk_set_tag() を使って、GUI部品(この例ではテキストフィールド)にタグを付けています。
yk_look() を使って、指定タグの付いたGUI部品(この例ではテキストフィールド)を取り出しています。

Ruby をはじめ、多くのプログラミング言語において、メソッド内のローカル変数はその名のとおり、メソッド内でしか有効ではありません。
この例では、 yki_make_display() にて画面構築時に作成したテキストフィールドを fn_callback() で使う(参照する)ために、GUI部品にタグ名を付けます。

YKLook ではすべてのGUI部品に任意のタグを付けることができます。
これにより yki_make_display() メソッドで画面構築時に作ったGUI部品を、コールバック用メソッドから参照できます。

yk_set_tag() は、戻り値としてそのGUI部品自体を返すので、以下のようにテキストフィールドを作るときにまとめて記述できます。
fld = YKLookTextField.new( 20 ).yk_set_tag( 'tf20' )

それぞれ詳細は、
で説明していますが、YKLook を初めてお使いになる方は気にせずにこのまま下の項目へお進みください。


重要: Webアプリとして起動しているときの注意事項です。
上の例の初期表示まではできた。
しかしその後ボタンを押してもテキストフィールドに表示されない。
このような症状が出たときは、YKLook の作業用ディレクトリが確保できていない可能性が高いです。
詳細は 環境設定 > YKLookの作業用ディレクトリ をご覧ください。


インスタンス変数を作る

以下の例は前項と同じ働きをしますが、GUI部品を参照するのにタグを使わず、インスタンス変数を使うようにしたプログラムです。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        @tf = YKLookTextField.new( 20 )        # 注目!
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        pan.yk_add( @tf )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback' )
        bt2.yk_set_listener( 'fn_callback' )
        yk_var( '@tf' )                        # 注目!
    end
    def fn_callback( prm_event )
        btn = prm_event.yk_source()
        msg = btn.yk_text()
        @tf.yk_set_text( msg )                 # 注目!
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

ここでの注目点は以下の3箇所です。
前項までは、テキストフィールド作成時にそのオブジェクトをメソッド内のローカル変数に代入していましたが、この項ではインスタンス変数に代入します。
そして yk_var() を使って、このインスタンス変数をセッション管理対象にします。
これ以降、インスタンス変数 @tf は、このプログラムをスタンドアロンとして起動したときもWebアプリとして起動したときもその内容を維持し、内容が変更されたときも自動的に更新します。

yk_var() 以外にも関連メソッドがあります。
詳細は、 クラス解説 YKLookMain で説明していますが、YKLook を初めてお使いになる方は気にせずにこのまま下の項目へお進みください。


重要: Webアプリとして起動しているときの注意事項です。
上の例の初期表示まではできた。
しかしその後ボタンを押してもテキストフィールドに表示されない。
このような症状が出たときは、YKLook の作業用ディレクトリが確保できていない可能性が高いです。
詳細は 環境設定 > YKLookの作業用ディレクトリ をご覧ください。


タグで分ける

以下の例は前項に似ていますが、テキストフィールドに表示するのはボタンの英語表現です。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        @tf = YKLookTextField.new( 20 )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        pan.yk_add( @tf )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback' )
        bt2.yk_set_listener( 'fn_callback' )
        bt1.yk_set_tag( 'bt1' )                # 注目!
        bt2.yk_set_tag( 'bt2' )                # 注目!
        yk_var( '@tf' )
    end
    def fn_callback( prm_event )
        btn = prm_event.yk_source()
        case btn.yk_tagname()                  # 注目!
            when 'bt1' then msg = 'Hello'
            when 'bt2' then msg = 'Good evening'
            else            msg = '????'
        end
        @tf.yk_set_text( msg )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

ここでの注目点は以下の3箇所です。
英語で表示するにあたって、どちらのボタンが押されたのかを識別せねばなりません。
それぞれのボタンに異なるタグ名を付けて区別することにします。
ボタンが押されたら、そのボタンのタグ名を取り出して、どちらのボタンかを判定します。

このプログラムは、実際にはタグを使わずに実現できます。
それぞれのボタンごとにコールバック用メソッドを定義すれば、もっと簡単にできます。
ですが、タグの使い方を示すためにこのようにしました。
以下はタグを使わない簡単バージョンです。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        @tf = YKLookTextField.new( 20 )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        pan.yk_add( @tf )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback_1' )
        bt2.yk_set_listener( 'fn_callback_2' )
        yk_var( '@tf' )
    end
    def fn_callback_1( prm_event )
        @tf.yk_set_text( 'Hello' )
    end
    def fn_callback_2( prm_event )
        @tf.yk_set_text( 'Good evening' )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )



重要: Webアプリとして起動しているときの注意事項です。
上の例の初期表示まではできた。
しかしその後ボタンを押してもテキストフィールドに表示されない。
このような症状が出たときは、YKLook の作業用ディレクトリが確保できていない可能性が高いです。
詳細は 環境設定 > YKLookの作業用ディレクトリ をご覧ください。


属性を加える

以下の例は前項と同じ働きをしますが、GUI部品に属性を追加してそれを使うようにしたプログラムです。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
class ExampleEvent < YKLookMain
    def yki_make_display()
        bt1 = YKLookButton.new( 'こんにちは' )
        bt2 = YKLookButton.new( 'こんばんは' )
        @tf = YKLookTextField.new( 20 )
        pan = YKLookPanelFlow.new()
        pan.yk_add( bt1 )
        pan.yk_add( bt2 )
        pan.yk_add( @tf )
        yk_add( pan )
        bt1.yk_set_listener( 'fn_callback' )
        bt2.yk_set_listener( 'fn_callback' )
        bt1.yk_put_property( 'en', 'Hello' )         # 注目!
        bt2.yk_put_property( 'en', 'Good evening' )  # 注目!
        yk_var( '@tf' )
    end
    def fn_callback( prm_event )
        btn = prm_event.yk_source()
        msg = btn.yk_get_property( 'en' )            # 注目!
        @tf.yk_set_text( msg )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( ExampleEvent.new() )

ここでの注目点は以下の3箇所です。
それぞれのボタンに 'en' というキーで属性値(それぞれの英語表記の文字列)を追加します。
コールバック用メソッドでは、押されたボタンの属性値を取り出して処理します。

補足: 大きな意味で言えば、タグも属性のひとつとも言えますが、タグはGUI部品を識別するための特別な属性と考えてください。

属性の詳細は、 クラス解説 YKLookSwingBase で説明していますが、YKLook を初めてお使いになる方は気にせずにこのまま次のページへお進みください。


重要: Webアプリとして起動しているときの注意事項です。
上の例の初期表示まではできた。
しかしその後ボタンを押してもテキストフィールドに表示されない。
このような症状が出たときは、YKLook の作業用ディレクトリが確保できていない可能性が高いです。
詳細は 環境設定 > YKLookの作業用ディレクトリ をご覧ください。




   
YKLook説明書 YKLook用アプリの製作 イベント処理 前へ   次へ


Copyright (c) 2003-2010 YorozuKotowariYa Ltd.