2008年11月22日土曜日

java-ja 第12回 Swingの実力

java-ja 第12回のイベントに行ってきました。
Swingネタをやるということなので、Swingを使って来た私としてはこれはいかねばぁー!と参戦して来たんですが、実はjava-jaのイベントに行くのは始めて。
一緒に行く予定だった旦那は仕事の関係上欠席ということで一人でドキドキしながら六本木へと向かう。

だって、java-jaのノリは...と噂には良く聞くので、不安いっぱい。
正直、怖かったよ。。

場所は六本木にあるグリーさんの所でした。綺麗な会議室!70名くらい集まったらしいんですが、まだ席も空きがあるくらいの余裕な広さ。さすが...すごいなぁ。ありがとうございます、グリーさん。

ということで、恒例の女性チェックしたかったんだけど、見渡すのも難しい!間違っているかもしれないけど、1,2人ぐらいだあったんかなぁ?

会場到着は15分遅れになっちゃったのですが、まだ始まってませんでした(笑)
yoshioriサンのトークで間を持たせている状態だったんですが、”java-ja始めての人〜?”という問いに対して手を挙げた方がそこそこいたので、ちょっと安心。

んが、その後の話の中で、「勉強会じゃないから」という発言が。
あれ...勉強会じゃーないんすか。勉強会のつもりで来ちゃってるよ、私。
ということで、始めにビールが配られる!
予定されていた内容が始まって行きましたが、確かに勉強会っぽくはない(笑)
なんといぅかー、仲良しのメンバーが集まって雑談しているぐらいのイメージ。良い意味でねっ

隣にいたのは、私同様、java-ja始めての方でした。
食べ物減るの早い...java-jaすげー!と一緒に共感できて心強かったです。
ですが、名刺交換をするのを忘れてしまい...残念ですぅ。またお会いできるといいんですが。

反対側の隣にはdisuke-mサンが! まさかそんな近くに知っている人がいるとは...声かけてもらった時にはマジびっくりしちゃいました。


一つ目は、太一サンの「SwingとSWTと.NET」
レイアウタと、Threadを題材にSwing,RCP,WindowsFormとで比較してみた結果について..でした。
リソースツリーが、左にあるjavaに対し右にある.NET。あー言われてみれば確かにそうですねぇ。
.NETは触った事がないのですが、自分が触るコードと、IDEが自動生成するクラスというのを分けて生成できるんですか。particial classってので。そういう心遣いはいいよねぇ。
レイアウタは、やっぱりWindowsの.NETがいい感じ。UIに慣れている会社って感がある。
Threadについては、RCPだとこんなにスマート! といいたかったんだあろうなぁと思いますが、その前に「この3つは、どれぐらいのファイルサイズになっているの?」という質問から、RCPのいけてない子が注目されてしまい...RCPがなんだかかわいそうな状態に(笑)


二つ目は、小野サンのSwingベースのDSLでした。
用事があって21時には帰らないと!という状態だったのですが、この時点で結構な時間に。
というか全て今日中に終わるのか?と不思議なペース〜 java-jaいつもこんな感じですか??

内容は、RoleObjectパターンについてでした。
IDEのようにSplitPaneなどでいろんなPaneがある状態の画面の場合、何かを変更したらそれと同期していろんなPaneの情報を切り替えたい! という事が良くある。
この場合はどんな実装する? 

1.Lisnterで実装する
Listenerでゴリゴリ実装...これしちゃうと大変。何か追加しようと思ったら何処に何を追加したらいいかもワカンなくなっちゃう。

2.Mediatorパターンで実装する
変更が必要なオブジェクトや発火イベントの受け取り口を用意したクラスを作って、そこに処理を固めてしまう。文字通り"調停役"
Listenerよりはいいけど、Paneの数が増えて行ったらこのMediatorクラスが膨大になっていっちゃう。

3.RoleObjectで実装する
Mediatorのような調停役に、各オブジェクトを登録する際に、クラス自体をKeyにRegistする。...この前提としては、基本は自分で拡張(継承)したクラスを使っていること。例えば、JListそのままは使っていない...
んで、自分のクラスにて必要な処理は、Role(役割)として記述する。
んで、Mediatorの方ではそのRoleを持っている場合はそのメソッドをCallする。
そうすると、自分の処理は、自分のクラス内や別のクラスとして書けるので、Mediatorはすっきりする。
合ってるかな?間違ってたらごめんなさい。

イメージ的には、EclipsePluginのgetAdapter(Class)のメソッドと一緒って事だと思います。多分。。

最後に、GUIのテストについて少し語られてましたが、マウスなどを動かしてテストするよりもまずはテストしやすいModelを作成して、そこでテストを書く...これは激しく同意。
自分の会社で、JFCUnitを拡張してマウスをグリグリ動かしてGUIのテストをするものを作成したんですが、そのせいで、自社の人はそぅいぅテストに集中してしまっているんじゃないかと凄く心配。
GUIを動かしてのテストは、頼りすぎてもいけない。全てをやろうとしてはいけない。と思います。その前にテストできる場所は多いはずで、テストすることを前提でクラス構成を考えるというのがトテモ重要と思いますです。

三つ目は、やまうらサンのレイアウトネタでした。
Swingでのレイアウトは大変。結局GridBagLayout使わないと思い通りに書けなかったりしますが、これも始めての人にはハードル高いですよね。。
そんな中、やまうらサンのレイアウタは、HTMLのテーブルタグでレイアウトを記述すればSwing上で表示できるものを作った!というものでした。
テーブルタグでレイアウトするなんて...CSSでやれよ!と言われいてる最近で、こぅいぅネタ出すのは...と謙遜(?)されていましたが、素晴らしいと思いました。
rowspanやcolspanも使えて、思い通り!
レイアウトで思い通りにイライラするよりも、自分の知っている事ですんなりできるというのは良い事ですよ。うん。
コードと、レイアウト情報が分離できるし。

といか、SwingもHTMLのCSSみたく、レイアウトは分離しちゃう方式にしたら良いよね。うん。

四つ目は、桜庭さんの「シンセサイザーのようなもの」
YMOの曲が流れ...何の話が始まるのか?という掴みから始まりました。この掴みはこぅいぅ場に慣れている人しか出来ないよなぁ。
んで、この前ふりの後には、L&FのSynthが本題でした。これってシンセって読むんですか?知らなかった。うふっ♪
XMLでL&Fの定義も書ける!ってものです。
SwingSet3も今までとは違ってカッコイイよ!しかも起動も今までと違って早い〜
"Swingいけるやん!"とみんなで盛り上がっていました。

五つ目は、岡崎さんの「JTableと方眼紙」
コンセプトも決まって無いけども、java-jaで発表することによって自分自身にハッパを書けるのが主目的ということで、控えめに始まりました(笑)

Excelの列を細かくして、方眼紙の状態にして使う...誰でも一度は見た事はあるもの。
ギークの方は嫌がるが、もぅこれはデファクトスタンダード。逃れられない。
んじゃー、方眼紙として扱う事を目的としたものを作れば良いんじゃない?
という発想とのこと。

どうして方眼紙のようにして使うのか...これは、思う所に文字が置ける!と、ソフトの機能をあまり知らなくても出来ちゃう 初心者に優しいインターフェースなんですね。

画面のハードコピーを送りますから...ログを送りますから...と言われて届いたメールに添付されているファイルの拡張子はなぜかxls。あるあるー!笑っちゃった。
でも私はExcel大好きですよぉ。ものすごく良く出来てるアプリと思う。

方眼紙は、3ミリが好き?5ミリが好き?7ミリが好き? この問いは岡崎さんならでわ。
頑張ってアプリつくってくださいー。

私的にはJTableのレンダラ/エディタの所...Excelみたいに初心者でも直感的に使えるような動きにしたものがあると良いと思うんだけどなぁ。
SwingのJTable使うと、
「IMがオンになっているとテーブル上で文字が入力できない」
ってクレームつく事とかありません?
この真相は、レンダラの状態になっている所で入力しようとしたが、IMオンになっているのでエディタ状態にならなくて、文字も反映されない って事なんですが。

これがSwingの動きっつーたらそうなんだけど、不親切ですよねぇ。
Excelのセルもレンダラ/エディタの状態ってあると思いますが、あまり気にせず使えてるんじゃないかと思います。SwingのJTableもあーなって欲しいーよー!

一回、根本的に、どうにかならんか?思ったんですが、んー。片手間にパパっとできるようなもんじゃなかったです。。

と、一通り終わったらもぅ余裕で11時過ぎ。
んでも皆余裕。終電っつー文字はあんまり無いんですかね??
私は心配だったので、そそくさ帰る組に。

そぅしたら、j5ik2oサンが!
一緒に仲良く帰らせて頂きました。おかげで駅にも無事に到着できて良かったぁ。
また 我が家にも来てくださいねー!土鍋とお水とカセットコンロだけ用意してお待ちしています〜

電車は終電。疲れました。。。
• • •