「Java & Cocoaプログラミングバイブル」追補情報 |
ここは、拙著の「Java &
Cocoaプログラミングバイブル」(秀和システム、560頁、3800円)に関するコーナーです。現在、初版の見直し作業をしていますが、校正情報やよ
くある質問の答えなどをここでまとめて掲載します。
また、記述間違い、校正漏れ、「ここの説明が全然わかんない!」といったことがあれば、どうぞ掌田津耶乃( tuyano@mac.com
)まで御連絡ください。ここで補足していきたいと思います。
★バグ・校正情報★ |
※ここでは、ソースコードや内容に関する記述間違い、校正ミスなどについて整理しておく予定です。現在、まだチェックの途中ですが、確認したところ まで掲載しておきます。
(誤)
●NSViewとNSControlの違い●
・NSViewには表示とイベント処理などを管理するセル(NSCell継承クラス)が標準で用意されていない。NSControlにはセルを組み込むメ
ソッドなどが用意されており、セルを組み込んで表示などを管理できる。
・NSViewはフォーカスを受け取れないが、NSControlはセルを組み込めるため、フォーカスを受け取れる。つまり、クリックやTabキーなどで
そのコントロールを選択することができる。
・フォーカスを受け取れるため、NSControlはキーボードからの入力を受け取って処理できる。NSViewはフォーカスがあるときにキー入力を受け
取ることができない。(ただし、キーボード処理が不可能というわけではない)
(正)
●NSViewとNSControlの違い●
・NSViewには表示を管理するセル(NSCell継承クラス)を組み込む機能が標準で用意されていない。NSControlにはセルを組み込むメソッ
ドがあり、組み込んで表示を管理できる。
・NSViewはフォーカスを受け取れないが、NSControlはフォーカスを受け取れる。つまり、クリックやTabキーなどでそのコントロールを選択
することができる。
・フォーカスを受け取れるため、NSControlはキーボードからの入力を受け取って処理できる。NSViewはフォーカスがあるときにキー入力を受け
取ることができない。(ただし、キーボード処理が不可能というわけではない)
セルに関する概念説明に不備がありました。本書の記述(誤)を読むと、NSCell継承クラスがイベント処理なども行なっているように読めてしま いますが、実際にはNSCellが行うイベント処理はアクションイベントのみです。他の一般的なイベントはNSControl側で処理されます。また、 「セルを組み込めるのでフォーカスを受け取れる」かのように記述してしまいましたが、これは正しくありません。フォーカスを受け取れることと、セルを設定 する機能があることは別の話です。以上、記述がごちゃごちゃになってしまいました。
(追加)Allows Reordering:各カラムの入れ替えを許可する。
(誤)Row height # Columns:表示する行数と列数。
↓
(正)Row height # Columns:表示する行幅と列数。
なぜか「Allows Reordering」の説明文だけが抜けて空白になっていました。また「Row
height」は読んで字の如く「行幅」です。全くの凡ミスでした。
メソッド3行目
window().convertBaseToScreen(initP); ←この文は、いらない。
見ればわかるんですが、これ、まったく何の役にもたってません。最初にmouseDownでコンバートしてmouseDraggedで戻すような処理を考 えていたのですが、途中で全部mouseDraggedで行なうようにした際、削除し忘れていたらしいです。まぁ、あっても別に問題はありませんが、「こ れって、意味ないじゃん?」と思った方もいることでしょう。不要ですので削除して結構です。
P.53 2-2-2の1行目「リスト2-1の」→「リスト2-6の」
P.58 最下行の(例)で、「new Farme().show();」→「new Frame().show();」
P.71 図3-1-4 「EAST」「WEST」の表示が「RIGHT」「LEFT」となっている
P.78 5行目 用意されているフォント名で、「SnasSerif」→「SansSerif」
P.158 2行目末尾「性格」→「正確」
P.194 下から3行目「切り替えた部」→「切り替えタブ」
P.205 3行目末辺り「バネ上の」→「バネ状の」
P.240 図7-2-2キャプション「従来はウィンドウの右上が〜」→「左上が」
P.246 7-2-5手前の「[例]NSColor c = NSColor.」→「NSColor c =
NSColor.blackColor();」
P.311 3段落目2行目末「作ってく見込む」→「作って組み込む」、最後から3行目「位置から」→「一から」
P.366 図10-1-3キャプション「〜をは位置し」→「〜を配置し」
P.380 本文下から3行目「難度か」→「何度か」
P.419 [例]の後の本文5行目「Cocoaのでは」→「Cocoaでは」
P.496 1行目「〜といアウトレット」→「〜というアウトレット」
※今のところ、見つかっている記述間違いは以上です。もし、何か発見したら御一報くださいませ。
★Mac OS X 10.2(Jaguar)対応コーナー★ |
※ここでは、Mac OS X 10.2に関する追補情報をまとめておきます。不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。
本書では、Appendixにて「Mac OS X 10.2向け開発ツールについて」として、10.2向けのProject
BuilderとInterface
Builderについて触れています。が、これは「10.2についてくるもの」についてではなく、執筆当時にリリースされていた「April 2002
DevTools」をベースとした説明になっています。
10.2のパッケージ版に付属するDevToolsでは、これらとは若干バージョンが違っています。整理すると以下のようになります。
Project Builder ver. 2.0.1
Interface Builder ver. 2.3
基本的には、April 2002 DevToolsに付属するものと大きな違いはありませんが、Project Builderについてはいくつか変更点があるので注意が必要です。――まず、10.2に付属するProject Builderは日本語化されています。ウィンドウの表示方式について本書では3つのスタイルを説明していますが、それぞれ以下のように名称変更されてい ます。
「Single Window」 → 「1つのウィンドウ」
「Some Window」 → 「いくつかのウィンドウ」
「Many Window」 → 「多数のウィンドウ」
また、「ターゲット」関係のインターフェイスが変わっています。従来は、タブを使って表示を切り替えていましたが、新バージョンでは項目の一覧が
左側に表示され、そこからダイレクトに選べるようになっています。(ただし、項目名はほぼ同じなので、すぐにわかります)
その他、本書で使用している機能などで「大きく変更されていて説明が必要」と思われる部分は、今のところほとんどありません。ご安心を。
10.2では、内蔵されるJavaのバージョンは、1.3.1となっています。java -versionで出力される表示は以下のようになっていました。
java version "1.3.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1-root_1.3.1_020714-12:46)
Java HotSpot(TM) Client VM (build 1.3.1_03-69, mixed mode)
従って、Java自体の機能としては、基本的に10.1も10.2も変化ないと考えてよいでしょう。予想されたver.
1.4への対応などもされておらず、Javaに関する限り、10.2は進化していないようです。
その他の変更点としては、「Java Plugin
Settings」アプリケーションが用意され、Javaプラグインに対応したようです。ただし、現状ではプラグインの有効化などの設定だけで、JVMの
変更などの機能は持っていないようです。
10.2では、Project Builderは2.0.1となっていますが、従来の10.1.5で使っていたProject
Builder(ver. 2.0より前のもの)のプロジェクトは、基本的に新しいProject
Builderでも利用できます。ただし、注意しておきたいのは「2.0以降で開いたプロジェクトは、ver.
1.xで利用できなくなる」ということです。旧バージョンのプロジェクトをver.
2.0以降で開くと、最初に確認のダイアログが現れます。ここで「開く」を選択すると、プロジェクトが2.0用に変換されます。
基本的に、旧バージョンのプロジェクトもそのまま新バージョンで使えるはずなのですが、こちらで確認したところ、プロジェクトによっては動作がおかしく
なることがあるようです。ビルドエラーになったり、プロジェクトを閉じる際にフレームワークのリンクが見つからないというエラーが出たりすることが稀にあ
りました。ですので、もしコンバートしたプロジェクトの動作がおかしかったら、面倒ですが新バージョンで新たに作り直してみて下さい。
public class ヌPROJECTNAMEASIDENTIFIERネ extends JFrame
implements ActionListener,
MRJAboutHandler,
MRJQuitHandler {
public ヌPROJECTNAMEASIDENTIFIERネ() {
super("");
・・中略・・
resbundle = ResourceBundle.getBundle ("ヌPROJECTNAMEASIDENTIFIERネstrings",
Locale.getDefault());
これら4か所のヌPROJECTNAMEASIDENTIFIERネという 部分を、プロジェクト名に書き換えてビルドすれば、問題なく動くようになります。ちょっと面倒ですが、プロジェクトを新規に作ったら、まずこれらを書き直 してからプログラミングを始めるようにして下さい。public static void main(String args[]) {
new ヌPROJECTNAMEASIDENTIFIERネ();
}
★Mac OS X 10.3(Panther)対応コーナー★ |
※ここでは、Mac OS X 10.3に関する追補情報をまとめておきます。不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。
public void tableViewSortDescriptorsDidChange(NSTableView tableView,
NSArray oldDescriptors) {
// 特に処理は不要
}
★内容の補足コーナー★ |
※ここでは、本書の内容について、「本文を読んだだけではよくわからない」というものや「もう少し他の説明が必要だ」と思われる部分について、捕足
していきます。もし「この説明だけではわからない」というようなものがあれば、どうぞご連絡下さい。要望の多いものはここで捕足できればと思います。
本書では、NSSliderの値を取り出すのに「takeIntValue」というメソッドを用いています(P.255)。これを読んで、
「NSSliderでは、通常のintValueなどは使えないのか」と思った方がいるかも知れません。読んでいただければわかると思いますが、これは
「takeIntValueFrom:が何を行なっているのか」を知るために利用したというものであり、「このメソッドを使わないといけない」ということ
ではありません。
intValueなどのメソッドはNSControlに用意されていますから、NSControlを継承したものであれば基本的にすべて利用できます。
もちろん、NSSliderなどの数量コントロールでも利用可能です。
★FAQコーナー★ |
※ここでは、本書の内容についての質問にお答えします。読んでいて不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。その場合は、必ずお使いのOSのバージョンなど動作環境について明記ください。
答え)
価格を少しでも抑えるため、CD-ROMの添付は見送ることになりました。が、サンプルプロジェクトは、オンラインで配付しています。本書の525頁を御
覧下さい。
答え)
どれがCocoaの機能をもっとも引き出せるか?というなら、もちろんObjective-Cでしょう。が、プログラミングをこれから始めようという人に
は、他にもっと重視すべき点があると思います。そうしたモロモロのことを考えた場合、Javaの方が勧められる、と判断しました。――が、もちろん
Objective-Cにも、更にはAppleScript
Studioにも、よい点はあり、「どれが一番」と簡単に決められるものではないでしょう。「他はダメ、これを使え」ということではなく、「もしどれがい
いか迷って決められないなら、とりあえずこれにしませんか?」ということですね。
答え)これは、ファイルパスに日本語が含まれている可能性が一番高いでしょう。Javaを使って開発をする場合、そのJavaファイルのパスに日本
語が含まれているとうまく動きません。10.15のみならず、10.2でも同様に日本語が含まれていると起動しなくなったりすることが確認できました
(10.2ではフォルダ名が日本語になってますが、これは「ディスプレイネーム」という表示上のものであり、実際のファイル/フォルダは依然としてすべて
英語です)。
これはProject
Builderの問題ではなくてシステムの問題のようで、完成したCocoa-Javaアプリを日本語のフォルダに入れて起動すると、やっぱり動かなく
なったりします(ところがpure
JavaのJARファイルだと問題なく動いたりします。謎です)。ですので、もし日本語を含むフォルダの中などにある場合には、プロジェクトを移動して再
度試してみて下さい。
答え)これは、筆者も何度か経験しました。Cocoa-Javaでは、Objective-Cによる起動用の小さなプログラムが作成されるのです
が、これのリンク情報の不具合からか、不要なライブラリをぶらさげたままプログラムファイルが作成されてしまうことがあるようです。そうすると、1つのア
プリが数Mbなんて巨大化してしまいます。「build」フォルダ内のものを全て削除し、再度ビルドしてみると普通にビルドされるようになったりします。
答え)これは、おっしゃる通りで、何もグラフィックが設定されていない状態で保存をしようとするとエラーになります。理由はしごく単純で、保存する 際のdataRepresentationOfTypeメソッドで、imageインスタンスがnullかどうかチェックするような処理をしていないからで す。ここではドキュメントベースのアプリケーションがどのようになっているかという基本を説明するため、細かな処理は省いてあります。そのため、こうした エラーの発生する場合もあるわけです。この他にも、基本部分に絞って説明をするためエラー処理などを省いている部分はあります。サンプルリストというの は、完璧だけど長くて複雑なものを掲載するより、未完成でもシンプルでわかりやすいものにした方がよいと考えますので、そのあたりご理解下さい。
答え)これは、NSViewではmouseEnterイベントをデフォルトで認識しないためです。このイベントを利用するにはTracking
Rectanglesというものを設定する必要があるのですが、そのためのメソッド(addTrackingRect)がJavaのNSViewクラスに
は用意されていないのです。このため、現状ではmouseEnterメソッドを利用できません。他にJavaでイベントを利用するための代案が用意されて
いないのか調べているのですが、少なくとも「Objective-Cでクラスを用意しないと使えない機能がある」ということは理解して下さい。