複数のウインドウ・フレーム
メインウインドウとは違う、別の表示内容を持つウインドウを作ることができます。
メインウインドウを開いたまま、これとは別にそのウインドウを開くことができます。
必要であれば、複数のウインドウを開くこともできます。
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
- Numeric , Integer , Bignum , Fixnum , Float
- Range
- Regexp
- String , Symbol
- TrueClass , FalseClass , NilClass
Array の要素や、
Hash のキーと値も、上記のクラスに限ります。
その範囲内であれば
Array や
Hash を入れ子にしたり組み合わせることもできます。
厳密には、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_find_frame()
-
yk_more_frame()
-
yk_userparam()
前項の
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( ...以下省略... )
|
Copyright (c) 2003-2010 YorozuKotowariYa Ltd.