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が分かる人はなんとなく分かると思いますが、現在は良くも悪くもSWTXMLに置き換えた状態です。

良いこと
SWTでできることはすべて表現できる(はず)
悪いこと
SWTが分からないとXMLを書けない(特にレイアウト周り)

特にレイアウト周りはもともとSWTが分かりにくいので、もうちょっとラップして使いやすいようにしたいです。

ボタンを押したときのアクションの呼び出しは、action属性を使って、こんな感じで書けます。

<control type="button" id="guButton" action="#{janken.goo}">

この場合、janken コンポーネントの goo メソッドが呼び出されるわけです。
この仕組みによって、アクションクラスはSWTのListenerを継承しなくて済むので、POJO化できます。

さらに、ここで呼び出されるアクションに対しては、GUIオブジェクト(Widgetのサブクラス)をフィールドインジェクションできるようにしています。

これについてはまた明日・・・。