S2JFaceの概要
昨日のカンファレンスのDI入門のセッションでやった「ジャンケン」のデモですが、
これ自体がS2JFaceのプロトタイプで作られています。
ちょっと長いですが、この画面を作成するためのXMLを全文掲載します。
XMLについては、作りながらも仕様を見直している状態なので、まだまだ変更の可能性があります。したがって、DTDはまだありません。
<?xml version="1.0" encoding="UTF-8"?> <template name="DIdeJanken"> <window id="janken" title="DIでジャンケン" x="center" y="middle" maxButton="true" minButton="true" closeButton="true" resizable="true" image="container.gif" layout="grid" layoutParam="numColumns=3"> <property name="backgroundColor" value="white"/> <property name="foregroundColor" value="black"/> <property name="fontSize" value="50"/> <control type="label"> <layoutData name="horizontalAlignment" value="FILL"/> <property name="text" value="コンピュータ"/> <property name="alignment" value="CENTER"/> </control> <composite type="box"> <layoutData name="horizontalAlignment" value="FILL"/> </composite> <control type="label"> <layoutData name="horizontalAlignment" value="FILL"/> <property name="text" value="あなた"/> <property name="alignment" value="CENTER"/> </control> <control type="label" id="computerWinLabel"> <layoutData name="horizontalAlignment" value="FILL"/> <property name="text" value="0 勝"/> <property name="alignment" value="CENTER"/> </control> <composite type="box"> <layoutData name="horizontalAlignment" value="FILL"/> </composite> <control type="label" id="playerWinLabel"> <layoutData name="horizontalAlignment" value="FILL"/> <property name="text" value="0 勝"/> <property name="alignment" value="CENTER"/> </control> <control type="label" id="computerHandImage"> <layoutData name="horizontalAlignment" value="FILL"/> <property name="image" value="blank"/> </control> <control type="label"> <layoutData name="horizontalAlignment" value="FILL"/> <layoutData name="verticalalAlignment" value="TOP"/> <layoutData name="grabExcessHorizontalSpace" value="true"/> <property name="text" value="vs"/> <property name="alignment" value="CENTER"/> <property name="fontsize" value="100"/> </control> <control type="label" id="playerHandImage"> <property name="image" value="blank"/> <layoutData name="horizontalAlignment" value="FILL"/> </control> <control type="label" id="messageLabel"> <layoutData name="horizontalSpan" value="3"/> <layoutData name="horizontalAlignment" value="FILL"/> <property name="text" value="じゃんけん・・・"/> <property name="alignment" value="CENTER"/> </control> <composite type="box" layout="fill" layoutParam="spacing=20; marginWidth=20"> <layoutData name="horizontalSpan" value="3"/> <layoutData name="horizontalAlignment" value="FILL"/> <control type="button" id="guButton" action="#{janken.goo}"> <property name="text" value="グー!"/> <property name="fontSize" value="50"/> </control> <control type="button" id="cyokiButton" action="#{janken.cyoki}"> <property name="text" value="チョキ!"/> <property name="fontSize" value="50"/> </control> <control type="button" id="paButton" action="#{janken.pa}"> <property name="text" value="パー!"/> <property name="fontSize" value="50"/> </control> </composite> </window> </template>
SWTが分かる人はなんとなく分かると思いますが、現在は良くも悪くもSWTをXMLに置き換えた状態です。
特にレイアウト周りはもともとSWTが分かりにくいので、もうちょっとラップして使いやすいようにしたいです。
ボタンを押したときのアクションの呼び出しは、action属性を使って、こんな感じで書けます。
<control type="button" id="guButton" action="#{janken.goo}">
この場合、janken コンポーネントの goo メソッドが呼び出されるわけです。
この仕組みによって、アクションクラスはSWTのListenerを継承しなくて済むので、POJO化できます。
さらに、ここで呼び出されるアクションに対しては、GUIオブジェクト(Widgetのサブクラス)をフィールドインジェクションできるようにしています。
これについてはまた明日・・・。