タイトル【今から始めるCocoaプログラミング】最初のアプリケーション(5)コンポーネントを探るカテゴリーCocoa, 今から始めるCocoaプログラミング
作成日2000/12/20 15:13:22作成者新居雅行
前回までにInterface Builderで作成したコンポーネントが、Javaで記述されたクラスの中に宣言された1つのインスタンス変数から参照できるようになっていることを説明した。Interface Builderでcontrolキーを押しながらドラッグして、インスタンス化したクラスからテキストフィールドを結び、Outletと結び付ける。そうすると、Javaのプログラムのそのクラス内では、Outletと対応したインスタンス変数が、テキストフィールドを参照するのである。テキストフィールドは、NSTextFieldというクラスだが、このクラスの使い方がどうなっているかをまずはチェックしてみよう。
クラスの使い方のドキュメントは、Developer ToolsをインストールしたMac OS Xにすでにインストールされている。ドキュメントは、/Developer/Documentation/Cocoa/cocoa.htmlというファイルをとにかくダブルクリックして開けばよい。

◇Cocoaのドキュメントが存在するフォルダ
 

このページは、AppleのWebサイトにあるのと同じもので、さらに、Appkitに関するHTMLのリンクをクリックする。もちろん、Java Frameworksの方を選ぶ。すると、クラスの一覧表がある。もちろん、ここで、NSTextFieldを参照してみよう。文字色や背景色などの設定を変更するメソッドの紹介はあるが、データの取り出しなどのメソッドが見つからない。その場合は、NSTextFieldの親クラスを見てみる。NSControlがそれだが、そこを見ると、データの基本的な設定のためのメソッドが見える。このメソッドは各種のコントロールに共通なもので、きっといちばんよく使うのだろう。データの型ごとにメソッドが用意されている。以下表にまとめておくが、この部分は等幅フォントで御覧いただきたい

データの型 値を設定 値を取り出す
---------------------------------------------
double setDoubleValue(x) doubleValue()
float setFloatValue(x) floatValue()
int setIntValue(x) intValue()
Object setObjectValue(x) objectValue()
String setStringValue(x) stringValue()

基本的な数値型として3種類、そして文字とオブジェクトとしてデータを出し入れできるということだ。setで始まるメソッドは、引数を取るがその型は表での「データ型」を指定する。戻り値はなくvoidだ。値を取り出すメソッドは、そのコントロールの値をデータ型で記した型で戻す。

それでは、ここで、「ボタンをクリックしたら、テキストフィールドに何か決まった文字列を代入する」という処理を組み込んでみたい。テキストフィールドは、TextField1というインスタンス変数が参照している。それに対して、setStringValueメソッドを適用すればいいわけだ。Java的に考えると思わず次のようなプログラムは思い浮かぶ。

TextField1.setStringValue("Oh My God!");

だが、これはエラーが出る。確かにTextField1はNSTextField型なのだが、プログラム上はObject型であり、setStringValueというメソッドは定義していない。従ってキャストが必要になり、次のようなプログラムになる。このステートメントを、ボタンをクリックしたときに呼び出されるメソッド、clickButtonに記述する。

((NSTextField)TextField1).setStringValue("Oh My God!");

◇クリックしたらテキストフィールドに文字を入れるプログラムを追加した
 

キャストがあるとちょっと回りくどい感じがしてしまうけど、それは仕方ない(もっとも、Objective-Cだとスマートなんだがと思われる方もいらっしゃるだろう)。もちろん、コンパイルして実行し、表示されるウインドウでボタンをクリックすると、プログラム中に埋め込んだ文字がテキストフィールドに入れられるのが分かるはずだ。図は示さないので、実際にやってもらいたい。

さて、ウインドウに配置したテキストフィールドの残り2つはそのままにしてしまっている。Interface Builderで、それらに対してもインスタンス化したMyWindowControllerのOutletと結合の設定を行なっておこう。MyDocument.nibのウインドウでClassesのタブを選択しておき、インスタンス化したMyWindowControllerのボックスからテキストフィールドに向かってcontrolキーを押しながらドラッグして、インスペクタで結合設定を行なう。

◇OutletのTextField2と2つ目のテキストフィールドを結合する
 
◇OutletのTextField3と3つ目のテキストフィールドを結合する
 

さらに、Project Builder側で、MyWindowController.javaのファイルをさらに編集する。クリックして実行されるclickButton1メソッドの内容を次の図ように書き込む。要は1つ目のテキストフィールドの値と、2つ目のテキストフィールドの値をdouble型の値として取り出し、そのかけ算結果を3つ目のテキストフィールドに設定するというものだ。つまり、「かけ算パネル」のようなウインドウになるという具合だ。

◇clickButton1メソッドに処理を書き込む
 

プログラムを見やすくするために、まずはインスタンス変数のTextField1を、目的とするNSTextField型の変数tField1に代入している。その他のインスタンス変数についても同様に処理をしている。これも回りくどいといえばそれまでだが、ソースを見やすくするには、こうした書き方の工夫も1つの方法だと言えるだろう。

プログラムを実行させて、上から2つのテキストフィールドに数字を入れてボタンをクリックしてみよう。3つ目のテキストフィールドにかけ算した結果が表示される。

◇プログラムの実行結果
 

ここまで来れば、電卓をプログラムすることくらいはできるのじゃないかと思うがいかがだろうか。電卓はありがちなテーマであるが、以上の知識で概ね作れる範囲ではないかと思う。答え合わせはしないけど、宿題と思ってとりかかってくれてはどうだろうか。

5回に渡って続けてきた『最初のアプリケーション』の一連のセッションは以上で終了だ。研究が進んだら【今から始めるCocoaプログラミング】シリーズの次のセッションをお届けしよう。
関連リンク