2009年4月28日火曜日

Hello World!

誰も書かない本当の基本から。これ以上はないと思います。ま、生徒は自分ですから。まずはHello World!です。が、ただ標準出力に出力するだけです。

1. netbeans で『新規プロジェクト作成』でJavaFXのプロジェクトを作成します。完全にデフォルトでOK。何も変更しなくてよろしい。なので特に何が出来るという説明や図解は不要だと思いますが、後々バージョンが変わって、内容が変更された場合にそなえて、一応載せておきます。

名前がJavaFXApplication5となっていますが、デフォルトで5回新規作成したためです。本当に最初に作成した場合は名前がJavaFXApplication1になります。

2. Main.fxの中身を全部削除します。ええ、きれいさっぱり。ファイルを削除するんじゃなく、あくまで中のコードを削除です。

3.そうしたら、ただ一行、println("Hello World!")と書きます。末尾のセミコロンも要りません。で、再生ボタンみたいな実行ボタンを押すと、出力部分にHello World!と表示されるはずなのですが...アリ? なんか微妙に文字が、、あ~おかしい。これはブログに書く前にやった"!"(びっくりマーク)が付いてないバージョンじゃないか。どうする?

それじゃあ、と適当に金槌に刷毛がくっついたアイコンをクリックしてみると、構築成功、と出力されたので、これがきっとクリーンかリビルドみたいなボタンなのでしょう。さあ気を取り直して実行すると・・・ものすごいエラーです。

どうやら、ソースコードの右側に電球マークが出ているのを無視してはいけなかったようです。


電球をクリックすると、

Change package to "javafxapplication5"
Move to correspondent folder

の二行が表示されます。

ここでMove to correspondent folderを選ぶと、プロジェクトツリーの下のソースパッケージというノードの下に<デフォルトパッケージ>というノードが追加され、そこにMain.fxが移動されます。しかしこれでは何も問題が解決しません。

一方、"Change package to "javafxapplication5"を選択すると、Main.fxの先頭行に package "javafxapplication5"という一行が挿入されます。つまりMain.fxは、

package javafxapplication5;
println("Hello World!")

の2行になります。こうして再生ボタンを押すと無事出力に更新されたHello World!が表示されました。

デフォルトで生成されるMain.fxのコードをそのまま使えば、ウィンドウに文字列が表示されます。そこを書き換えてHello World!にするのもアリなのですが、printlnって何?っていう説明が見当たらない。といっても標準出力に文字を出力しますよ、ってことじゃなしに、Stage:と来るようなオブジェクト指向言語が、まるでC言語のmain()で始まってprintf("Hello World!")って何よっていう。自分としては、基本的な仕様として、Stageというウィンドウのインスタンスを作る以前に、JavaFXの構成要素が何で、ソースファイルにはどんな種類があって、それぞれのソースファイルの中の記述順序はどうなっていて、どこから実行が始まるのか、といった超基本的なところから、厳密な(エラーのない)プロジェクトファイル(ソース)一式と対で欲しいのです。

そういう観点で、自分が抱いた疑問、そして解決に至った経緯をロギングしていこうかなと。で、最終的にプロジェクトファイルを積み上げていくようなチュートリアルが書けるようになりたいと思います。少なくともどんなに小さいことでも、常にプロジェクト(netbeansのようなIDEに拠らないということであればファイル構成)と対になった形で残したい。

櫻庭さんの記事を飛ばして読むと、『クラスを作る』のところで、クラス名とファイル名を合わせるという話の中で、この辺はJavaと同じ、という説明があります。しかし私はJavaを使ったことがないから、そんなことも知らないわけです。厳密には本とかを斜め読みしたり、サンプルを改造してみたりといった程度で触ったことはあります。でも基本的には難しくないので、逆にちゃんとした厳密な理解が出来ていない。大体の内容を理解するには良かったのですが、ご覧の通り、たった1行のプログラムを書くにも事欠く始末です。

Sunのサイトに素晴らしい入門用のチュートリアルがあるのですが、これが本当に有難くて、ちゃんとrunから実行が開始される話や、(runが)省略されたら引数なしのrunが自動生成される話なども書かれているのですが、先に進んでいくと、AddressとCustomerという2つのクラスが出てくるパートで、エラーになってしまい、先に進めなくなってしまいました。チュートリアルにはAddress.fxとCustomer.fxを同じディレクトリに置けばよいとしか書いていないと思うのですが・・・。でも1つのファイル、例えばCustomer.fxにAddress.fxの内容をコピーすれば通る(エラーじゃなくなる)のです。コピペしているし、書き間違いは見当たらない。ファイル名もクラス名をコピペしているので、同じはずです。もちろん目視でも何度も確認しました。昨日の深夜3:00までやって、とりあえず諦めました。でもこのエントリを書いたことで、ひょっとしてpackageを追加して刷毛をクリックすれば通るのでは?という予感もしていますが、さてどうでしょうか。あとでやってみます。---> やってみました。ぜんぜん違いました。結論からいうとAddressクラスの各変数にpublicもしくはprotectedが付いてなかったからです。もうすっかり忘れてました。もちろんチュートリアルがファイルを別にしていてるのは問題だと思いますが、2年前ならすぐ気づいていたでしょうね・・・残念。

あと他にも何度刷毛アイコンをクリックしてもXMLファイルを示すエラーが消えなくて悩んでいたのですが、どうにも分からなくて、強引に実行ボタンをクリックすると、3つのファイルのどれがmainか?みたいな問い合わせダイアログが出てきて、それでMainとなるファイル(このとき名前はtestになってました。このHello World!とは別なプロジェクトなので)を指定したら、何事もなかったかのように通ってしまいました。そーゆーことぉ・・・ふう。

このHello World!の出力とは、オブジェクト指向といいつつ、いきなりprintlnみたいな関数がハダカで使える意義って何っていう、この痛々しい気持ちの出力なのです。

1 件のコメント:

  1. おっと、Cでもprintf()を使うには、#include "stdio.h"だったか?何がしかのヘッダのインクルードが必要なのを思い出しました。コンパイラによっても違うかもしれません。

    返信削除