YKLook説明書 YKLook用アプリの応用 複数のウインドウ・フレーム 前へ   次へ
   

複数のウインドウ・フレーム


メインウインドウとは違う、別の表示内容を持つウインドウを作ることができます。
メインウインドウを開いたまま、これとは別にそのウインドウを開くことができます。
必要であれば、複数のウインドウを開くこともできます。
YKLook により開くウインドウは「フレーム」とも言います。

詳細については クラス解説 YKLookMainFrame の説明をご覧ください。


ウインドウ・フレームの定義

ウインドウ・フレームの定義は、メインウインドウの定義に似ています。
メソッド yki_make_display() を実装・オーバーライドすることで、初期表示をおこないます。

require '/opt/yklook/swingframe'
class SimpleFrame < YKLookMainFrame
    def yki_make_display()
        lab = YKLookLabel.new( 'フレーム' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( lab )
        yk_add( pan )
    end
end

メインウインドウとの違いは、派生元のスーパークラスが YKLookMain ではなく YKLookMainFrame になることです。
また、ウインドウ・フレームを使うときは、 swingframe をロードする必要があります。
メソッド yki_size() yki_title() 等は YKLookMain と同じように実装・オーバーライドすることができます。


ウインドウ・フレームの生成

ウインドウ・フレームを生成し表示するプログラム例です。

YKLookMainFrame.yk_more_frame( SimpleFrame.new() )

以下は、具体的に示したプログラム例です。
ボタンを押すと、メインウインドウとは別にウインドウ・フレームを表示します。

#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
require '/opt/yklook/swingframe'
class FirstWithButton < YKLookMain
    def yki_make_display()
        btn = YKLookButton.new( 'ボタン' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( btn )
        yk_add( pan )
        btn.yk_set_listener( 'fn_cb_button' )
    end
    def fn_cb_button( prm_event )
        YKLookMainFrame.yk_more_frame( SimpleFrame.new() )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
class SimpleFrame < YKLookMainFrame
    def yki_make_display()
        lab = YKLookLabel.new( 'フレーム' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( lab )
        yk_add( pan )
    end
end
YKLookMain.yk_mainloop( FirstWithButton.new() )

上の例の SimpleFrame クラスの定義を、別のソースファイル (たとえば simpleframe.rb ) に保存し、それを require するのも良い方法です。

first.rb
#!/usr/bin/ruby -Ke
require '/opt/yklook/swing'
require '/opt/yklook/swingframe'
require 'simpleframe'
class FirstWithButton < YKLookMain
    def yki_make_display()
        btn = YKLookButton.new( 'ボタン' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( btn )
        yk_add( pan )
        btn.yk_set_listener( 'fn_cb_button' )
    end
    def fn_cb_button( prm_event )
        YKLookMainFrame.yk_more_frame( SimpleFrame.new() )
    end
    # Webアプリは yki_ht_farpath() を忘れずに
end
YKLookMain.yk_mainloop( FirstWithButton.new() )
simpleframe.rb
#!/usr/bin/ruby -Ke
class SimpleFrame < YKLookMainFrame
    def yki_make_display()
        lab = YKLookLabel.new( 'フレーム' )
        pan = YKLookPanelFlow.new()
        pan.yk_add( lab )
        yk_add( pan )
    end
end

simpleframe.rb の1行目の記述がなくても多くの場合は問題ありません。
しかし、Ruby 構文チェック(ruby -c simpleframe.rb)で誤動作することがありますので、記述していたほうが無難です。
とくに文字符号化方法がシフトJISのときに誤動作しやすいです。
first.rb simpleframe.rb の文字符号化方法は統一してください。


データの受け渡し

前項の生成・表示時にデータを受け渡すことができます。

YKLookMainFrame.yk_more_frame( SimpleFrame.new(), ['param01'] )

受け渡しデータは常に配列の形にしてください。
この配列の要素数は任意です。
ここではその要素として文字列をひとつだけ渡していますが、文字列以外にも以下のクラスのオブジェクトをいくつでも渡すことができます。
Array の要素や、Hash のキーと値も、上記のクラスに限ります。
その範囲内であれば ArrayHash を入れ子にしたり組み合わせることもできます。
厳密には、Ruby の組み込み Marshal 機能でシリアライズが可能な オブジェクトである限り、ウインドウ・フレームに情報を受け渡すことができます。

h = { 'key1' => obj1, 'key2' => obj2 }
a = [ val1, val2, val3 ]
YKLookMainFrame.yk_more_frame( SimpleFrame.new(), [h, a] )

ウインドウ・フレーム側では、メソッド yk_userparam() にて受け渡しデータを参照できます。
受け渡しデータと yk_find_frame() を利用して、任意のウインドウ・フレームを参照することもできます。

各メソッドの詳細については クラス解説 YKLookMainFrame の下記メソッドの説明をご覧ください。


データの共有

前項の yk_more_frame() yk_userparam() を使ったデータの受け渡しは、 yk_more_frame() の呼び出し元と呼び出し先の間でのみ有効です。
その間だけでなく、一連の操作に関わる複数のウインドウ・フレーム間でデータを共有するには、 yk_userdata() を使ってください。
詳細は 画面遷移 → 複数の画面で共有する をご覧ください。


イベント処理

ウインドウ・フレーム内のイベント処理も、メインウインドウと同じように記述できます。
以下の例は、ウインドウ・フレーム内にボタンがひとつあり、そのボタンを押すとダイアログを表示するプログラムです。

class FrameExampleEvent < YKLookMainFrame
    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
end

また、GUIオブジェクトに付けるタグや、インスタンス変数はそれぞれのウインドウ・フレームごとに独立しているので、名前の重複を気にせずに使うことができます。


クローズ処理

アプリ利用者によりウインドウ・フレームを閉じる操作がおこなわれた場合、デフォルトではそのフレームをコンピュータ画面から消去し、フレーム内部のすべてのGUI部品を削除し、YKLook の管理対象外とします。
一方、プログラム側からウインドウ・フレームを閉じる場合、以下の二つの処理に分かれます。
閉じる処理を含め、ウインドウ・フレームの表示に関するメソッドは以下のとおりです。

メソッド名 概要
yk_dispose() 完全消去
yk_hide() 非表示
yk_set_close_operation() アプリ利用者によるクローズ操作時の動作指定
yk_show() 表示
yk_show_within_screen() 表示
yki_closing() クローズ時のコールバック用メソッド定義
yki_need_show() 表示可否指定

詳細は クラス解説 YKLookMainFrame の各メソッドの説明をご覧ください。


メインウインドウの参照

メインウインドウ以外のウインドウから、メインウインドウを参照するには、 YKLookMain.yk_main() を使ってください。

実際の話、 YKLookMainFrame クラスにあるダイアログ表示用のメソッドは、内部的には以下のようになっています。

YKLookMain.yk_main().yk_show_dialog_message( ...以下省略... )




   
YKLook説明書 YKLook用アプリの応用 複数のウインドウ・フレーム 前へ   次へ


Copyright (c) 2003-2010 YorozuKotowariYa Ltd.