GO HOME

「Java & Cocoaプログラミングバイブル」追補情報


  ここは、拙著の「Java & Cocoaプログラミングバイブル」(秀和システム、560頁、3800円)に関するコーナーです。現在、初版の見直し作業をしていますが、校正情報やよ くある質問の答えなどをここでまとめて掲載します。
 また、記述間違い、校正漏れ、「ここの説明が全然わかんない!」といったことがあれば、どうぞ掌田津耶乃( tuyano@mac.com )まで御連絡ください。ここで補足していきたいと思います。


  ★バグ・校正情報★

※ここでは、ソースコードや内容に関する記述間違い、校正ミスなどについて整理しておく予定です。現在、まだチェックの途中ですが、確認したところ まで掲載しておきます。


※システムのバージョンについて

本書では「現行の10.1.2は…」とか「10.1.5以降では…」というように、10.1.2から10.1.5までの細かなバージョンがあちこち登場し ます。これで「一体、バージョンいくつ以降対応なんだ?」と混乱した方もいるかも知れません。
 P.15で説明してあるように、本書の説明は10.1.3以降を対象に考えています。それ以外のバージョンがあった場合には、「そこで説明している内容 については、このバージョン以降で対応しているという意味だ」ということです。例えば、作成したソフトを古いシステムで動かすと問題が起きたりするケース もあるので、そういう表記をしてあります。開発自体は、10.1.3以降であれば問題ないと考えて下さい。


※P.22 1-2-4. Project Builderのウィンドウについて

ディスプレイのアイコン
プロジェクトを実行する。(ビルドしないと使えない)
スプレーのアイコン
プロジェクトをデバッグモードで実行する。(ビルドしないと使えない)

どちらも、現在のProject Builder 1.1.1では「ビルド&実行」「ビルド&デバッグ」となっており、ビルドしなくとも使えるようになっています。


※P.109 「Checkbox/CheckboxGroupの選択状態用メソッド類」の例文

(誤)boolean f = checkboxgroup1.getSelectedCheckbox();
    ↓
(正)Checkbox cb = checkboxgroup1.getSelectedCheckbox();

例文としてあげたもののメソッドと返す値の関係がおかしくなってました。getSelectedCheckboxはCheckboxを返すものですから booleanではまずいですね。上のように修正しておきます。


※P.42 「配列の宣言」について

配列の宣言の書き方として、「変数のタイプ[] 変数名」と記してありますが、実際のコードでは「変数のタイプ 変数名[]」と記されています。これは、間違いというより「宣言の書き方は両方できる」のです。つまり「int[] a」「int a[]」のどちらでも問題ないのですね。が、配列宣言のフォームとして片方しか掲載されていなかったために混乱してしまっことと思います。


※P.115 ScrollBarの範囲について

本文で「0〜100の範囲で値が設定されるようにしておきました」とありますが、実際やってみるとわかりますが「0〜80の範囲で」です。 setVisibleAmount()の幅分が範囲からとられてしまうので、ここでは20を最大値から引いて80までとなります。


※P.166 リスト5-5

最下行の「public void sendData() {」の後に、もう1行あるはずの文が抜けています。この後に、本来は「Socket s1 = null;」という文が存在します。これがないと、Socketの宣言がないためコンパイル時にエラーとなってしまいます。
 これは、秀和システムのHPにて配付しているサンプルプロジェクトでは正しいコードが収録されていますので問題なく動くのですが、本書の記述を見て自分 でコードを書いた場合には、うまく動かず頭を悩ませた方もいらっしゃるかも知れません。大変申し訳ありませんでした。


※P.174 リスト5-6

最下行の「add(p1,BorderLayout.SOUTH);」の後に、「}」記号があるはずですが抜けています。これは TestJavaApplicationコンストラクタメソッドを閉じる役割の}記号です。これがないとビルド時に文法エラーとなってしまいます。


※P.249 図7-2-11キャプション

図のキャプションが他のものに入れ替わっていました。これはリスト7-10の実行図です。「リスト7-10を実行する。ボタンをクリックすると入力した数 値にテキストのサイズが変わる」というものです。


※P.262 リスト7-12

リストが「button1Click」というメソッド名になっていますが、作成する手順にメソッド名を「popup1Change」としてあり、名前が異 なっています。修正前のメソッド名が残っていたようです。どちらかに統一してお考え下さい。


※P.387 10-2-4. NSControl継承クラスを作る

(誤)
●NSViewとNSControlの違い●
・NSViewには表示とイベント処理などを管理するセル(NSCell継承クラス)が標準で用意されていない。NSControlにはセルを組み込むメ ソッドなどが用意されており、セルを組み込んで表示などを管理できる。
・NSViewはフォーカスを受け取れないが、NSControlはセルを組み込めるため、フォーカスを受け取れる。つまり、クリックやTabキーなどで そのコントロールを選択することができる。
・フォーカスを受け取れるため、NSControlはキーボードからの入力を受け取って処理できる。NSViewはフォーカスがあるときにキー入力を受け 取ることができない。(ただし、キーボード処理が不可能というわけではない)

(正)
●NSViewとNSControlの違い●
・NSViewには表示を管理するセル(NSCell継承クラス)を組み込む機能が標準で用意されていない。NSControlにはセルを組み込むメソッ ドがあり、組み込んで表示を管理できる。
・NSViewはフォーカスを受け取れないが、NSControlはフォーカスを受け取れる。つまり、クリックやTabキーなどでそのコントロールを選択 することができる。
・フォーカスを受け取れるため、NSControlはキーボードからの入力を受け取って処理できる。NSViewはフォーカスがあるときにキー入力を受け 取ることができない。(ただし、キーボード処理が不可能というわけではない)

 セルに関する概念説明に不備がありました。本書の記述(誤)を読むと、NSCell継承クラスがイベント処理なども行なっているように読めてしま いますが、実際にはNSCellが行うイベント処理はアクションイベントのみです。他の一般的なイベントはNSControl側で処理されます。また、 「セルを組み込めるのでフォーカスを受け取れる」かのように記述してしまいましたが、これは正しくありません。フォーカスを受け取れることと、セルを設定 する機能があることは別の話です。以上、記述がごちゃごちゃになってしまいました。


※P.432 NSTableViewの主な属性

(追加)Allows Reordering:各カラムの入れ替えを許可する。

(誤)Row height # Columns:表示する行数と列数。
   ↓
(正)Row height # Columns:表示する行幅と列数。

なぜか「Allows Reordering」の説明文だけが抜けて空白になっていました。また「Row height」は読んで字の如く「行幅」です。全くの凡ミスでした。


※P.491 リスト12-8のmouseDownメソッド

メソッド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に関する追補情報をまとめておきます。不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。


Project BuilderとInterface Builderのバージョンについて

本書では、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」 → 「多数のウィンドウ」

 また、「ターゲット」関係のインターフェイスが変わっています。従来は、タブを使って表示を切り替えていましたが、新バージョンでは項目の一覧が 左側に表示され、そこからダイレクトに選べるようになっています。(ただし、項目名はほぼ同じなので、すぐにわかります)
 その他、本書で使用している機能などで「大きく変更されていて説明が必要」と思われる部分は、今のところほとんどありません。ご安心を。


Javaのバージョンについて

 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用に変換されます。
 基本的に、旧バージョンのプロジェクトもそのまま新バージョンで使えるはずなのですが、こちらで確認したところ、プロジェクトによっては動作がおかしく なることがあるようです。ビルドエラーになったり、プロジェクトを閉じる際にフレームワークのリンクが見つからないというエラーが出たりすることが稀にあ りました。ですので、もしコンバートしたプロジェクトの動作がおかしかったら、面倒ですが新バージョンで新たに作り直してみて下さい。


pure Javaプロジェクトのクラス名問題について

 Project Builderでpure Javaプロジェクトを作成すると、プロジェクト名のクラスが作成されます。が、10.2に付属するDeveloper ToolsのProject Builder 2.0.1では、作成されるクラスのクラス名部分が「ヌPROJECTNAMEASIDENTIFIERネ」と化けてしまうという、かなりとんでもないバ グが確認されました。どうも、テンプレートを元にプロジェクト名にあわせて置換すべきところを置換しないままソースコード出力してしまっているようです。 これは、手作業でクラス名の部分を修正すれば問題解決しますので、同様の問題が発生した場合は、以下の点を書き換えてみて下さい。

1.作成されたプロジェクト名のクラスファイルの、クラス宣言部。
public class ヌPROJECTNAMEASIDENTIFIERネ extends JFrame
implements ActionListener,
MRJAboutHandler,
MRJQuitHandler {

2.デフォルトコンストラクタ部分。
    public ヌPROJECTNAMEASIDENTIFIERネ() {
super("");
・・中略・・
resbundle = ResourceBundle.getBundle ("ヌPROJECTNAMEASIDENTIFIERネstrings",
Locale.getDefault());

3.mainメソッド部分。
    public static void main(String args[]) {
new ヌPROJECTNAMEASIDENTIFIERネ();
}

 これら4か所のヌPROJECTNAMEASIDENTIFIERネという 部分を、プロジェクト名に書き換えてビルドすれば、問題なく動くようになります。ちょっと面倒ですが、プロジェクトを新規に作ったら、まずこれらを書き直 してからプログラミングを始めるようにして下さい。


※この問題の原因と解決手段について
 読者の方から、この問題の原因と解決手段についてご連絡いただきました。これは、ユーザの名前が日本語に設定されていると起こるようです。英語のユーザ 名にすると問題は発生しません。
 ユーザ名の変更は、Mac OS Xインストール時、一番最初に作成したユーザについては(そのままでは)変更できません。ですので、普段使うユーザを新たに作り、その名前を英語にしてお いて、そちらを普通は使うようにするのが一番手っ取り早いでしょう。もし「今使っている一人めのユーザ名を変更したい」という場合は、sudoやroot ユーザを利用すれば可能です。ただしこれらの作業は危険を伴うので、やり方をわかる人のみ行なって下さい。


Javaの在り処について

 1-1-3[Javaはどこにある?]にて、Javaのコマンドやフレームワークが置かれているディレクトリについて説明してありますが、これらはバー ジョンによって変更される可能性があります。特にJavaのライブラリ関係は、バージョンによって微妙に異なります。記述と違いがある場合も、システムと DevToolsのインストールが問題なく行なわれていれば特に異常があるわけではありませんのでご心配なく。




 ★Mac OS X 10.3(Panther)対応コーナー★

※ここでは、Mac OS X 10.3に関する追補情報をまとめておきます。不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。


NSTableView.DataSourceの変更について

本書の11-2-3にてNSTableView.DataSourceクラスを作成していますが、10.3ではこのクラスが変更され、全部で計7つのメ ソッドになっています(それまでは6つ)。すなわち、1つメソッドが追加になっているのです。このDataSourceをimplementsしたクラス を作成する場合、この新たに追加されたメソッドを追記しておかないとビルドできません。具体的には、以下のようなメソッドをクラスに追加しておいて下さ い。

public void tableViewSortDescriptorsDidChange(NSTableView tableView,
NSArray oldDescriptors) {
// 特に処理は不要
}




 ★内容の補足コーナー★

※ここでは、本書の内容について、「本文を読んだだけではよくわからない」というものや「もう少し他の説明が必要だ」と思われる部分について、捕足 していきます。もし「この説明だけではわからない」というようなものがあれば、どうぞご連絡下さい。要望の多いものはここで捕足できればと思います。


 ●NSSliderなど数量コントロー ルの値の取得について

本書では、NSSliderの値を取り出すのに「takeIntValue」というメソッドを用いています(P.255)。これを読んで、 「NSSliderでは、通常のintValueなどは使えないのか」と思った方がいるかも知れません。読んでいただければわかると思いますが、これは 「takeIntValueFrom:が何を行なっているのか」を知るために利用したというものであり、「このメソッドを使わないといけない」ということ ではありません。
 intValueなどのメソッドはNSControlに用意されていますから、NSControlを継承したものであれば基本的にすべて利用できます。 もちろん、NSSliderなどの数量コントロールでも利用可能です。


●NSControl継承クラスの利用について

本書のP.386から、NSControlを継承したクラスを作成しています。ここでは、作成したクラスをデザインウィンドウに配置する手順などを特に記 していないため、ツールパレットを調べ「NSControlの部品がないぞ」と悩んだ人もいるかも知れません。
 この例のように、NSView以外のクラスを継承してコントロールを作成する場合も、デザインウィンドウへの配置はNSViewの部品として配置し、そ れからInfoウィンドウの「Custom Class」で利用するクラスを選択するようにして下さい。例えば、NSButtonを継承したクラスの場合、つい「NSButtonを配置して Custom Classを変更する」というやり方を考えてしまうことと思います。が、このようにするとビルドして実行した際にエラーが発生することが確認できました。 もしこのようにしてエラーになった場合には、「NSViewとして配置してから変更する」ようにしてみてください。


●ナンチャッテ Scriptable Application について(おまけ?)

現在、Mac OS Xの開発では「AppleScript Studio」と呼ばれるものが用意されています。これによりAppleScriptを使ったCocoaアプリの開発ができることはご存じの方も多いで しょう。また、AppleScript StudioによるCocoaアプリは、(当たり前ですが)Scriptableなアプリケーションとなり、メニューやウィンドウなどの大半を AppleScriptで制御できるようになります。
 Cocoa-JavaでもScriptableなアプリを作りたい、と思う人。実はAppleScript Studioを利用することで、ややこしいことを考えずともScriptableなアプリを作ることができます。Project Builderで新規プロジェクトを作成する際、「Cocoa-Java Application」ではなく「AppleScript Application」を選べばよいのです。これを使うと、AppleScript Studioによるアプリ作成のプロジェクトが作られます。そのまま、AppleScriptの部分は無視して、新たにJavaのクラスを作り、普通に Cocoa-Javaのアプリとして開発をすればいいのです。
 このようにすると、AppleScript StudioでサポートされているすべてのAppleScriptの予約語が利用可能になった、Scriptableなアプリケーションが作成できます (もちろん、JavaだけでなくObjective-Cでも同様です)。ただし、プログラマが自分で追加した機能などは自動的に追加されたりはしません。 が、とりあえずAppleScript対応アプリになるのですから、「これからはJavaでもObjective-Cでも、新規プロジェクトには 『AppleScript Application』を使うのが基本」と考えたほうがいいかな?と思います。



 ★FAQコーナー★

※ここでは、本書の内容についての質問にお答えします。読んでいて不明な点などありましたら、どうぞ 掌田津耶乃 までお問い合わせください。その場合は、必ずお使いのOSのバージョンなど動作環境について明記ください。


●本書にはCD-ROMがついてませんが、サンプルファイルなどはないのですか?

答え) 価格を少しでも抑えるため、CD-ROMの添付は見送ることになりました。が、サンプルプロジェクトは、オンラインで配付しています。本書の525頁を御 覧下さい。


●本書では「Java + Cocoaが最強」とありますが、やっぱりCocoa開発はObjective-Cなのでは?

答え) どれがCocoaの機能をもっとも引き出せるか?というなら、もちろんObjective-Cでしょう。が、プログラミングをこれから始めようという人に は、他にもっと重視すべき点があると思います。そうしたモロモロのことを考えた場合、Javaの方が勧められる、と判断しました。――が、もちろん Objective-Cにも、更にはAppleScript Studioにも、よい点はあり、「どれが一番」と簡単に決められるものではないでしょう。「他はダメ、これを使え」ということではなく、「もしどれがい いか迷って決められないなら、とりあえずこれにしませんか?」ということですね。


●サンプルプロジェクトをビルドすると全く問題なく動くのですが、実行す ると「Unknown class `MyObject' in nib file, using `NSObject' instead.」というエラーが現れ、ボタンをクリックしても何も動きません。

答え)これは、ファイルパスに日本語が含まれている可能性が一番高いでしょう。Javaを使って開発をする場合、そのJavaファイルのパスに日本 語が含まれているとうまく動きません。10.15のみならず、10.2でも同様に日本語が含まれていると起動しなくなったりすることが確認できました (10.2ではフォルダ名が日本語になってますが、これは「ディスプレイネーム」という表示上のものであり、実際のファイル/フォルダは依然としてすべて 英語です)。
 これはProject Builderの問題ではなくてシステムの問題のようで、完成したCocoa-Javaアプリを日本語のフォルダに入れて起動すると、やっぱり動かなく なったりします(ところがpure JavaのJARファイルだと問題なく動いたりします。謎です)。ですので、もし日本語を含むフォルダの中などにある場合には、プロジェクトを移動して再 度試してみて下さい。


●プロジェクトをビルドしたら、ほんの十数行しかないのに、2Mbもの巨 大アプリになってしまいました。Cocoa-Javaって、こんなにでっかいの?

答え)これは、筆者も何度か経験しました。Cocoa-Javaでは、Objective-Cによる起動用の小さなプログラムが作成されるのです が、これのリンク情報の不具合からか、不要なライブラリをぶらさげたままプログラムファイルが作成されてしまうことがあるようです。そうすると、1つのア プリが数Mbなんて巨大化してしまいます。「build」フォルダ内のものを全て削除し、再度ビルドしてみると普通にビルドされるようになったりします。


●11-4「ドキュメントベース・アプリケーション」でサンプルを実行 し、「New」メニューで新規にウィンドウを開いて保存しようとするとエラーになるんですが。

答え)これは、おっしゃる通りで、何もグラフィックが設定されていない状態で保存をしようとするとエラーになります。理由はしごく単純で、保存する 際のdataRepresentationOfTypeメソッドで、imageインスタンスがnullかどうかチェックするような処理をしていないからで す。ここではドキュメントベースのアプリケーションがどのようになっているかという基本を説明するため、細かな処理は省いてあります。そのため、こうした エラーの発生する場合もあるわけです。この他にも、基本部分に絞って説明をするためエラー処理などを省いている部分はあります。サンプルリストというの は、完璧だけど長くて複雑なものを掲載するより、未完成でもシンプルでわかりやすいものにした方がよいと考えますので、そのあたりご理解下さい。


●NSViewを継承したクラスでmouseEnterメソッドを書 いたのですが呼び出されせん。

答え)これは、NSViewではmouseEnterイベントをデフォルトで認識しないためです。このイベントを利用するにはTracking Rectanglesというものを設定する必要があるのですが、そのためのメソッド(addTrackingRect)がJavaのNSViewクラスに は用意されていないのです。このため、現状ではmouseEnterメソッドを利用できません。他にJavaでイベントを利用するための代案が用意されて いないのか調べているのですが、少なくとも「Objective-Cでクラスを用意しないと使えない機能がある」ということは理解して下さい。


●ビルドすると「\64は不正な文字です」と いうエラーが起きます。が、いくら見てもコードの書き間違いは見つかりません。

答え)これは、ごく稀に制御コード・キャラクタがコード内に混じっているために発生するエラーです。古いプロジェクトをコンバート したり、ワープロなど他のソフトからソースコードをコピー&ペーストした際に起こることがあります。表示されている文字でなく、非表示の文字として不正な キャラクタが含まれているため、見た目にはどこが悪いのかわからないのが困りものです。
 このようなエラーが起きた時には、まず空白部分(インデントされている部分や、文末後の余白など)を削除して、手作業で書き直して下さい。それでもだめ な場合は、面倒ですがその行をすべて削除し、書き直してみて下さい。




GO BACK
GO HOME