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のサブクラス)をフィールドインジェクションできるようにしています。
これについてはまた明日・・・。
