前々からやってみようと思っていたのですが、ScalaでClickを使ってみました。
ページクラスはこんな感じ。
package jp.sf.amateras.click.scala.page import org.apache.click._ import org.apache.click.control._ class HelloPage extends Page { val form = new Form("form"); val name = new TextField("name", true) val submit = new Submit("submit", "Send") override def onInit() = { form.add(name) form.add(submit) submit.setActionListener(new ActionListener(){ override def onAction(source: Control): Boolean = { println(name.getValue()) true } }) addControl(form) } }
うーん…、これはどうなんだ…。
まず、publicフィールドが使えないからFormを自分でaddControl()する必要があったり、ActionListenerの書き方もScalaっぽくなかったり。ただ、このへんを改善してもあまりScalaっぽくはならない気がするんですよね。
どうせやるならもっと徹底的に、こんな感じに書けるといいかなみたいな。
class HelloPage extends Page { val form = Form("form"){ val textName = TextField("name", true) val submit = Submit("submit", "Send"){ source => println(textName.getValue()) true } } }
Formのフィールドに宣言したフィールドは自動的にFormにadd()され、ページクラスのフィールドに宣言したコントロールは自動的にaddControl()されるイメージです。自動でやるのが乱暴であればアノテーションで制御するようにしてもいいかもしれません。