「Hello User!」サンプル
静的なコンテンツについて理解できたところで、次は、イベントに応答し、Webページのコンテンツを更新することがいかに簡単であるかを見ていきましょう。Guiseは背後でAjaxを自動的に使用しているため、サーバとの通信はバックグラウンドで発生し、ページの再ロードを引き起こすことなく、Webページへの変更が動的に行われます。では、Hello Worldパネルを少し変更して、Hello Userパネルを作成してみましょう。
package com.example; import com.guiseframework.component.*; import com.guiseframework.component.layout.*; import com.guiseframework.event.*; import com.guiseframework.validator.RegularExpressionStringValidator; public class HelloUserPanel extends LayoutPanel { public HelloUserPanel() { super(new FlowLayout(Flow.PAGE)); setLabel("Guiseu2122 Demonstration: Hello User"); final Label greetingLabel = new Label(); greetingLabel.setVisible(false); add(greetingLabel); final TextControl<String> userInput = new TextControl<String>(String.class); userInput.setLabel("What's your name?"); userInput.setInfo("Enter a name that does not start with whitespace."); userInput.setValidator(new RegularExpressionStringValidator ("S+.*", true)); add(userInput); final Button greetButton = new Button(); greetButton.setLabel("Greet"); greetButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent actionEvent) { if(HelloUserPanel.this.validate()) { final String user = userInput.getValue(); greetingLabel.setLabel("Hello, "+user+"!"); greetingLabel.setVisible(true); } } }); add(greetButton); } }
ご存知のように、ボタンの押下などのイベントを検出するには、関連するコントロールにイベントリスナをインストールする必要があります。イベントリストに加えて、このパネルには、Hello Worldサンプルと異なる点がいくつかあります。
new FlowLayout(Flow.PAGE)
new Label()
greetingLabel.setVisible(false)
new TextControl<String>(String.class)
String)。これは、ユーザーがテキストを入力しても、コントロールに格納される実際の値は、例えばBooleanの可能性もあり(trueとfalseのテキストで表現されます)、テキストとは限らないためです。userInput.setInfo(...)
userInput.setValidator(...)
S+.*(空白以外の文字と、それに続くゼロ個以上の文字)で制限します。new Button()
greetButton.addActionListener(...)
validate()
userInput.getValue()
Guiseの優れた機能
駆け足の説明でしたが、Guiseの使用について、感じはつかめたことでしょう。今後の記事では、高級なアーキテクチャの概念から強力な対話機能に至るまで、Guiseフレームワークのさまざまな要因を、じっくりと、包括的に扱う予定です。さらに興味を持っていただくために、以降では、高度でありながら簡単に使用できるGuiseの機能をいくつか紹介します。
正規表現のマップ先
Guiseのマップ先は正規表現で指定できます。例えば、パネルを<property:pathPattern>[^/]+/help</property:pathPattern>にマップして、「test/help」や「anything/help」などのパスに対応できます。
WebTrends準拠の自動ログ
Guiseアプリケーションディスクリプションに<property:DCSID>webTrendsSDCID</property:DCSID>を追加することで、WebTrends準拠のログファイルを自動的に生成できます。
ユーザーの変更
GuiseSession.setPrincipal(java.security.Principal)の呼び出しを通じて現在の「プリンシパル」を変更することによって、ユーザーログインおよびログアウトを実行できます。
ロケールの変更
別の言語への変更は簡単です。GuiseSession.setLocale(java.util.Locale)を呼び出すだけで現在のセッションのコントロールが再設定され、必要に応じて新しいテキストや他のリソースが読み込まれます。
コンテナはコレクション
Guiseの個々のContainerはJavaのIterableです。for(final Component<?> child:panel)を使用するだけで、例えばパネルのすべての子コンポーネントのイテレーションが可能です。
コントロールのプロトタイプ
Guiseには特別な「プロトタイプ」が用意されており、属性と機能を共有する各種のコンポーネントを、簡単かつ統一された方法で作成できます。例えば、1つの「ファイルの保存」プロトタイプを作成すると、プロトタイプの正しい(国際化された)ラベルとアイコンを自動的に継承するボタンとメニュー項目を簡単に作成できます。これらは、選択されるとプロトタイプのアクションを実行し、プロトタイプが適切だと判断すると、無効または有効になります。
高度なセマンティクス
Guiseでは、単に機能を記述するだけでなく、情報セマンティクスを定義できます。GuiseComponent.setInfo(java.lang.String)を使用して情報をコンポーネントに割り当てると、既定でツールヒントが表示されます。GuiseComponent.setDescription(java.lang.String)を使用して説明を設定すると、GuiseComponent.setFlyoverEnabled(boolean)でフライオーバもオンになっている場合は、フライオーバ表示になります。
ブックマーク
ブックマークを簡単に設定できます。ユーザーがページに初めてアクセスしたときにコンポーネントに特別な処理を行わせるには、NavigationListenerインターフェイスを実装します。URIパラメータが、BookmarkとしてNavigationEventオブジェクトに渡されます。
まとめ
Guiseは新しいインターネットアプリケーションフレームワークですが、急速に成長しており、複雑な現実のアプリケーションで評価を得ています。Guiseは標準のJavaを通じてアクセスできる強力で洗練されたオブジェクト指向のユーザーインターフェイスパラダイムであり、Guiseを使用する開発者は、Ajaxなどの下位レベルの基本テクノロジを意識せずに済みます。
GuiseはXHTMLやJavaScriptを記述することなくインターネットアプリケーションを作成できる総合的な標準ベースのフレームワークであり、新しいインターネットアプリケーションのSwingおよびMFCとなることが期待されています。
