NetBeans での SimpleSwingApplication ではまって Mavenプロジェクトにしてみた
追記: NetBeansの普通のScalaプロジェクトでも、ちゃんと実行出来る方法がありました。お騒がせしました。末尾に追記しておきました。
NetBeans6.9にて。
SimpleSwingApplicationを継承したオブジェクトをMainとして使っているとはまります。
ScalaでSwingアプリを作る場合、javaのSwingを普通にimportしても勿論書けますが、scala.swing下にjavaのSwingをラップした便利なクラスが沢山用意してあり、Scalaっぽく書くなら、これを使います。
で、SimpleSwingApplicationを継承したobjectを使うと、setDefaultCloseOperationとか,mainメソッドとか、invokeLater云々などのセットアップに必要な紋切り型のコードを書かなくてもすむようになります。
ちなみに、mainメソッドがなくなっているわけではなく、SimpleSwingApplicationが継承しているSwingApplicationに、mainメソッドが定義されています。
で、main→startup→topと呼ばれています。
そんな便利な代物なのですが、今回これではまりました。
どういうことかというと、NetBeansで普通にScalaプロジェクトを作成した場合に、NetBeansはこのSimpleSwingApplicationを継承したオブジェクトにはmainがないと判断してしまうんですね。
なのでmainメソッドもったやつがいないぞーという事で、プロジェクトを実行することが出来ません。
そのソースファイル一つで完結している場合は、Run Fileで動作させることが出来るのですが、例えばコンポーネント毎に継承したクラスを作ったりして複数ファイルにしてしまうと、主プロジェクトを実行が出来ないので、複数ファイルをコンパイル出来ず困ってしまいます。
あとあと、SimpleSwingApplicationを継承したオブジェクトだったり、panelなりで、各コンポーネントを当然まとめてnewしている訳なのでRun Fileではコンパイル出来ずにこけてしまいます。
NetBeans内で解決する方法としてはいくつかあるかと思います。
一つはパッケージをコンパイルを実行して、まとめて複数ファイルを処理しておき、SimpleSwingApplicationを継承したオブジェクトをRun Fileしてしのぐ。
あるいは、scala.swing.SwingApplicationのmainメソッドをSimpleSwingApplicationを継承したオブジェクトでオーバーライドして定義してしまう。
そもそもSimpleSwingApplicationを使うのを諦めるというのもあるでしょう。
また、1ファイルに全部のクラスを書いてしまうという手もあります。
はたまた、NetBeans標準のScalaプロジェクトではなくMavenという手もあります。
最初のやり方だと一々面倒なのと、仮にパッケージをいくつか分けるような規模になるとこのやり方は通用しなくなってしまいます。
また、二番目はせっかく遮蔽されているのにオーバーライドしてしまったらDRYじゃないですよね。
三番目は、なんかScalaせっかく使ってるのに悔しいです(w
4番目は、一つのファイルにばんばん書けるというある意味Scalaらしいともいえるのですが、メンテナンス性を考えると普通やりませんよね。
で、今回は最後にあげたMavenプロジェクトとして作成を選択しました。
これだと普通に実行できました。
ただ、気をつけるところが二つほどありました。
Simple Scala projectというのを選んで作成したのですが、Scalaのバージョンが2.7.0になってました。
なので、pom.xmlを編集して、2.8.0に変更しときました。
また、import scala.swing._とかするとないよーと怒られます。
こちらもpom.xmlにscala-swingを追加しときました。
これでばんばん作成出来ますね
追記:普通のScalaプロジェクトでも、プロジェクトのプロパティでSimpleSwingApplicationを継承したオブジェクトをMain Classにきっちり設定すれば、ちゃんと動作してくれました。
これぐらいはJavaやってる方にとっては常識なんでしょうか・・。
相変わらずJava由来の環境まわりで躓いてますね。
あと、NetBeansは"出来る子"、疑ってごめんよ。