3. ビューをデザインする
ここでは、アプリケーションのビューを作成します。
3.1. CSS ファイルのインポート
HTML コンポーネントの外観をカスタマイズするには CSS ファイルを使用します。
- [ファイル|新規|その他] を選択します。
- Web を展開して [CSS] を選択し、[次へ] をクリックします。
- Web フォルダを選択し、ファイル名として「stylesheet.css」を入力して [終了] をクリックします。
![](images/img10B.jpg)
新しいファイル stylesheet.css が、Web アプリケーションのルート フォルダ、たとえば web (Web アプリケーション ルート) の下に作成されます。
- workshop-jsf-tutorial/web/Resources/stylesheet.css ファイルのすべてのコードを web/stylesheet.css ファイルにコピーします。
- stylesheet.css ファイルを保存します。
3.2. images フォルダの作成
このアプリケーションでは、画像ファイルを images フォルダに格納します。
- [ファイル|新規|フォルダ] を選択します。
- [新しいフォルダ] ウィザードで親フォルダ workshop-JSF-tutorial/web を選択し、フォルダ名として「images」と入力します。
- [終了] をクリックします。
これにより、web アプリケーションのルート フォルダ、たとえば web (Web アプリケーション ルート) の下に、新しいフォルダ images が作成されます。
- 画像ファイル banner.gif を、workshop-jsf-tutorial/web/Resources/images フォルダから workshop-jsf-tutorial/web/images フォルダにコピーします。
3.3. ビューの作成
ここでは、ユーザ登録フォームを表示する register.jsp という名前の JSP ページを作成します。
- [ファイル|新規|その他] を選択し、Web を展開して [JSP] と [次へ] をクリックします。
- [ファイル名] フィールドに「register.jsp」と入力し、ファイルの格納先として workshop-jsf-tutorial/web/pages を選択します。
![](images/img11.jpg)
- [次へ] をクリックします。
- テンプレートとして [新規 JSP ファイル (HTML)] が選択されていることを確認して [次へ] をクリックします。
- リソース バンドル ベース名 [リソース|アプリケーション] を選択します。このベース名は、register.jsp で使用します。
![](images/img11D.jpg)
- [終了] をクリックします。
- register.jsp という名前の空の JSP ページが作成されます。JSF コア タグ ライブラリからの JSF タグ <f:view> および <f:loadBundle> が含まれています。コードを開いて確認します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" contentType="text/html; charset=iso-8859-1" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:loadBundle basename="resources.application" var="bundle"/>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
</body>
</html>
</f:view> |
- デフォルトでは、新しい JSP ファイルに
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
という taglib 行は追加されません。
この行をコピーして register.jsp ファイルに追加してください。
loadBundle タグの basename 属性は、アプリケーションのリソース パッケージ内に格納されている ResourceBundle を参照します。basename 属性には、ファイルの完全修飾クラス名を指定する必要があります。
3.4. register.jsp ビューのデザイン
ここでは、UI コンポーネントを追加して JSF ページ register.jsp をデザインします。
JSF ページをデザインするには、利用可能な JSF タグとして [デザイン パレット] ビューに表示されるタグを使用します。
[デザイン パレット] ビューの [JSP 変数] セクションには、その JSP ページで使用できる変数の一覧が表示されます。一覧から変数を選択して、JSP ページに簡単に挿入できます。変数のスコープは各種のアイコンで示されます。
![](images/img15.jpg)
各変数をマウスでポイントすると、その変数に関する情報が表示されます。
Session スコープの変数 user を右クリックすると、ポップアップ メニューが表示されます。
ポップアップ メニューには、以下の操作を実行するためのオプションが表示されます。
- 変数の Java クラスに関連付けられているソース ファイルに移動する
- faces-config.xml ファイル内の変数定義に移動する
- 変数またはそのフィールドをページに挿入する
3.4.1. ページ タイトルとスタイルシートの指定
- register.jsp の <title> タグ内のテキスト「Insert Title Here」を削除し、「<h:」と入力して〔Ctrl〕+〔Space〕キーを押します。
![](images/img18.jpg)
JSF HTML タグ ライブラリのタグの一覧が表示されます。これは、Workshop AppXRay テクノロジによって提供される、コード補完という非常に便利な機能です。
- タグの一覧から h:outputText タグを選択して〔Enter〕を押します。これにより、空の <h:outputText/> タグが追加されます。
- outputText タグを閉じる前に〔Space〕キーを押します。outputText 属性の一覧が表示されます。
![](images/img19.jpg)
- <h:outputText> タグの属性値を選択します。
- [プロパティ] タブを選択します。
[スマート エディタ] タブで、Value 属性のアイコン
をクリックします。
- [バインディングの選択] ダイアログで、[リソース] タブをクリックして [新しいリソース キー] リンクをクリックします。
- [新しいリソース キー] エディタで、[リソース キー] フィールドに「registerPageTitle」、[リソース値] フィールドに「Workshop への登録」と入力します。
- [新しいリソース キー] エディタで [OK] をクリックします。
新しいキーと値のペアが、リソース バンドル application.properties ファイルに追加されます。
- [バインディングの選択] ダイアログで [OK] をクリックします。
- [デザイン パレット] ビューで、HTML タグ リストから
Import CSS File タグをドラッグし、register.jsp ページの [デザイン エディタ] (=上方の空白のペイン) にドロップします。 ![](images/img22.1.jpg)
- [ファイルの選択] ダイアログが表示されます。workshop-jsf-tutorial/web/stylesheet.css ファイルを選択します。
![](images/img23.jpg)
- これにより、</head> タグの前に、CSS ファイルを参照する <link> タグが追加されます。
<link rel="stylesheet" type="text/css" href="../stylesheet.css"> |
- register.jsp ファイルを保存します。
3.4.2. HTML テーブルの追加
WYSIWYG の JSF エディタでは、[デザイン パレット] ビューのタグ ライブラリに登録されているすべてのタグをドラッグ アンド ドラッグできます。
- [デザイン パレット] ビューで、HTML タグ リストから
テーブル タグをドラッグし、register.jsp ページの [デザイン エディタ] にドロップします。[テーブル タグ] ダイアログが表示されます。
- [テーブル タグ] ダイアログで、次の図のようにパラメータを入力します。
![](images/img26.jpg)
- [OK] をクリックします。
- HTML table タグが、register.jsp ページの body タグ内に追加されます。
3.4.3. ページへの画像の追加
- [デザイン パレット] ビューの JSF HTML タグ リストから
[グラフィック イメージ] タグを HTML テーブルの 1 行目にドロップします。
![](images/img28.jpg)
- [
URL] のアイコン をクリックし、画像ファイル banner.gif を選択して [OK] をクリックします。
![](images/img30.jpg)
- [
代替] (画像の代替テキスト) のアイコン をクリックします。[バインディングの選択] ダイアログで、[リソース] タブをクリックして [新しいリソース キー] リンクをクリックします。
![](images/img28B.jpg)
- [新しいリソース キー] エディタで、リソース キーとして「alt_img_text」、リソース値として「JSF エディタ」と入力します。
- [新しいリソース キー] エディタで [OK] をクリックします。
新しいキーと値のペアが、リソース バンドル application.properties ファイルに追加されます。
- [バインディングの選択] ダイアログで [OK] をクリックします。
- [グラフィック イメージ タグ] ダイアログで [OK] をクリックします。
- これにより、HTML テーブルの 1 行目に <h:graphicImage> タグと属性値が追加されます。
- register.jsp ページを保存します。
![](images/img33.jpg)
分割ペイン ビューの [デザイン] タブをクリックすると、WYSIWYG のエディタ (デザイン エディタ) に切り替えることができます。
![](images/img34.jpg)
もちろん、ソース エディタに切り替えてソースのみで作業することもできます。
![](images/img35.jpg)
3.4.4. アプリケーション メッセージの追加
ユーザ登録時にすでに存在するユーザ ID が入力されたら、ユーザに再入力を求めるメッセージを表示する必要があります。UserBean の registerUser( ) メソッドは、入力されたユーザ ID がすでに存在する場合に FacesMessage を FacesContext に追加するメソッドです。
ここでは、要求の処理時に FacesContext に追加されたエラー メッセージを register.jsp ページに表示するための <h:messages> を追加します。
- エディタのドラッグ アンド ドロップ機能を使用して、[
Messages] タグを JSF HTML タグ ライブラリから HTML テーブルの 2 行目に追加します。
- [メッセージ タグ] ダイアログで [グローバルのみ
] チェック ボックスをチェックします。
[レイアウト] フィールドの値が「table」になっていることを確認します。
CSS スタイルシート クラスを設定するには、
スタイル クラスのアイコン をクリックします。[CSS スタイル クラスの選択] ダイアログで、[validationMessage] を選択して [OK] をクリックします。
![](images/img39.jpg)
- [メッセージ タグ] ダイアログで [OK] をクリックします。
- これにより、HTML テーブルの 2 行目に <h:messages> タグと属性値が追加されます。
- デザイン エディタの h:messages UI コンポーネントの後ろで〔Enter〕を押します。
![](images/img39B.jpg)
- register.jsp ページを保存します。
3.4.5. HTML フォーム、フォーム フィールド、検証エラー メッセージの追加
ここでは、HTML フォームとフォーム フィールドのタグを追加します。また、各フォーム フィールドのバリデータも定義します。この手順を実行する過程で、Workshop のさまざまな機能を習得できます。
- ドラッグ アンド ドロップ機能を使用して、[
Form] タグを JSF HTML タグ ライブラリから HTML テーブルの 2 行目 (h:messages プレースホルダの後ろ) に追加します。
![](images/img41.jpg)
- [
フォーム Bean] フィールドの横にあるアイコン をクリックします。[Bean/プロパティの選択] ダイアログで、JSF 管理対象 Bean [user] を選択して [OK] をクリックします。
- [
フォーム アクション] フィールドの横にあるアイコン をクリックします。[メソッドの選択] ダイアログで、[user] 管理対象 Bean の [registerUser] メソッドを選択します。
[次へ] をクリックします。
![](images/img43.jpg)
- [user] Bean のプロパティのうち、フォームの入力フィールドにバインドするプロパティをすべて選択して [次へ] をクリックします。
![](images/img44.jpg)
- [フォーム タグ] ダイアログで、[上へ] および [下へ] ボタンを使用して、フィールドの順序を次の図のように設定します。
[contactDetails.address] フィールドの [入力タイプ] を [テキスト領域] に設定します。
[contactDetails.country] フィールドの [入力タイプ]
を [リスト] に設定します。
![](images/img45.jpg)
- [次へ] をクリックします。
- このアプリケーションでは検証エラー メッセージを表示する必要あるので、[Insert Validation Error Messages] チェック ボックスがチェックされていることを確認します。
[
スタイル クラス] フィールドの横にあるアイコン をクリックします。
[CSS スタイル クラスの選択] ダイアログで、[validationMessage] を選択して [OK] をクリックします。
![](images/img46.jpg)
- [終了
] をクリックします。
これにより、JSF HTML ラグ ライブラリからタグが挿入されます。挿入されるのは、HTML テーブルの <h:panelGrid> タグを含む <h:form> タグ、フォーム フィールド ラベルの <h:outputText> タグ、フォーム フィールドの <h:inputText>、<h:selectOneListbox>、および <h:inputTextarea> タグ、検証エラー メッセージの <h:message> タグなどです。
![](images/img47.jpg)
また、UserBean.registerUser() メソッドを参照する action 属性を含む <h:commandButton> タグも追加されます。
<h:message> タグの for 属性値は、対応するフォーム フィールドの id 属性値を参照します。
3.4.6. [プロパティ シート] と [スマート エディタ] の使用
[selectOneListbox] フィールドには、国の一覧が表示されます。ここでは、[プロパティ シート] タブと [スマート エディタ] タブを使用し、一覧に項目を追加してそのプロパティを指定します。この手順を進める過程で、[プロパティ シート] と [スマート エディタ] の違いを理解できます。
- デザイン エディタで、国のリストボックスを選択します。[プロパティ] ビューの [プロパティ シート] タブに、<h:selectOneListbox> タグに定義されている属性の一覧が表示され、ソース ウィンドウは対応するタグへ移動します。
[プロパティ シート] タブには、すべてのタグ属性とその値が表示されます。属性の型によっては、属性値の編集を支援する属性値ピッカーが表示されます。
[スマート エディタ] ビューは、効率的に編集を行うための UI を提供します。
- [スマート エディタ] タブで、[
Static Items] 属性の横にあるアイコン をクリックします。
- [項目の選択 リストの編集] で [追加] をクリックします。
- [項目の選択タグ] ダイアログで、[ラベル] フィールドに「United States of America」、[値] フィールドに「USA」と入力します。
- この手順を繰り返して、[項目の選択 リストの編集] ダイアログを次の図のように編集します。
![](images/img49.jpg)
- リストが完成したら [OK] をクリックします。
3.4.7. 編集の同期
- [WYSIWYG の JSF (デザイン) エディタ] ビュー、[ソース エディタ] ビュー、[プロパティ] ビュー、および [アウトライン] ビューは相互に同期します。つまり、いずれかのビューに加えた変更は、リアルタイムで他のビューに反映されます。
- [スマート エディタ] ビューの [レンダリング プロパティ] セクションで、[タイプ] フィールドのオプションとして [メニュー] を選択します。これにより、Country リスト タグが <h:selectOneListbox> タグから <h:selectOneMenu> タグに変更されます。
3.4.8. テーブル ヘッダとテーブル フッタの挿入
- デザイン エディタで h:panelGrid コンポーネントを右クリックし、ポップアップ メニューから [パネル グリッド|テーブル ヘッダの挿入] を選択します。
![](images/img51.jpg)
JSF コア タグ ライブラリの <f:facet> によってテーブル ヘッダ行が追加されます。
![](images/img52.jpg)
- JSF HTML タグ ライブラリから [出力テキスト] タグをドラッグし、テーブル ヘッダ行にドロップします。
- [出力テキスト タグ] ダイアログで、[
値] フィールドの横にあるアイコン をクリックします。[バインディングの選択] ダイアログで、[リソース] タブをクリックして [新しいリソース キー] リンクをクリックします。
![](images/img54.jpg)
- [新しいリソース キー] エディタで、[リソース キー] フィールドに「registerFormHeader」、[リソース値] フィールドに「メンバーの登録」と入力します。
![](images/img55.jpg)
- [新しいリソース キー] ダイアログで [OK] をクリックします。
新しいキーと値のペアが、リソース バンドル application.properties ファイルに追加されます。
- [バインディングの選択] ダイアログで [OK] をクリックします。
- [出力テキスト タグ] ダイアログで [OK] をクリックします。
- デザイン エディタで h:panelGrid コンポーネントを右クリックし、ポップアップ メニューから [パネル グリッド|テーブル フッタの挿入] を選択します。
- [ソース ビュー] で、[送信] ボタン (<h:commandButton action="#{user.registerUser}" value="Submit"/>) をテーブル フッタに移動します。
- register.jsp ページを保存します。
3.4.9. テーブルのスタイル クラスの指定
- デザイン エディタで、h:panelGrid コンポーネントを選択します。
- [スマート エディタ] で [
テーブル クラス] のアイコン をクリックし、[CSS スタイル クラスの選択] ダイアログで [table-background] オプションを選択して [OK] をクリックします。
- [カラム クラス] テーブル プロパティのアイコン
をクリックし、[スタイル値の編集] ダイアログで次の図のように 3 つのカラムのスタイルを選択して [OK] をクリックします。
![](images/img57.jpg)
- これで、テーブルとテーブル カラムの CSS スタイル クラスを指定できました。次は、テーブル ヘッダとテーブル フッタの CSS スタイル クラスを設定します。
- [プロパティ] ビューで [プロパティ シート] タブ ビューを選択し、headerClass 属性の [値] カラムをクリックします。アイコン
が表示されます。アイコン
をクリックし、[CSS スタイル クラスの選択] ダイアログでスタイル クラス [table-header] を選択して [OK] をクリックします
- 同様の手順で、[footerClass] スタイル シート属性のスタイル クラス [table-footer] を選択します。
- フォーム フィールドを 1 つずつ選択します ([アドレス] フィールドを除く)。[スマート エディタ] タブの [スタイル クラス] フィールドに「form-field」と入力します。
- register.jsp ページを保存します。
3.4.10. フォーム フィールドのバリデータの定義
次に、HTML フォーム フィールドの検証ルールを設定します。次の表に、フォーム フィールドの検証ルール (条件) の例を示します。
![](../../../images/callout_top_left.gif) |
![](../../../images/sp.gif) |
![](../../../images/callout_top_right.gif) |
![](../../../images/sp.gif) |
フォーム フィールド |
フィールドの型 (入力の型) |
検証ルール (条件) |
ユーザ ID |
文字列 (テキスト フィールド) |
必須。 4 ~ 8 文字の文字列でなければならない。 |
パスワード |
文字列 (パスワード フィールド) |
必須。 1000 ~ 9999 の間の数値でなければならない。 |
氏名 |
文字列 (テキスト フィールド) |
必須。 |
住所 |
文字列 (テキスト領域) |
必須。 |
市町村 |
文字列 (テキスト フィールド) |
必須。 |
国 |
文字列 (リスト) |
必須。 |
郵便番号 |
文字列 (テキスト フィールド) |
必須。 |
|
![](../../../images/sp.gif) |
![](../../../images/callout_bottom_left.gif) |
![](../../../images/sp.gif) |
![](../../../images/callout_bottom_right.gif) |
- デザイン エディタで、userId テキスト フィールドを選択します。[スマート エディタ] タブに、userId テキスト フィールドの <h:inputText> タグの属性が表示されます。 [検証] セクションの [必須] チェック ボックスをチェックします。これにより、userId テキスト フィールド タグに required="true" 属性が追加されます。
- [
バリデータ] フィールドの横にあるアイコン をクリックします。[バリデータの編集] ダイアログで [追加] ボタンをクリックし、[長さバリデータ] オプションを選択します。
![](images/img59.jpg)
- [長さバリデータ タグ] ダイアログの [最小長] フィールドに「4」、[最大長] フィールドに「8」と入力し、[OK] をクリックします。これにより、userId テキスト フィールドのバリデータ一覧に、JSF の標準の [長さバリデータ] が追加されます。
- [バリデータの編集] ダイアログで[OK] をクリックします。
JSF コア タグ ライブラリの <f:validateLength> タグが、userId 入力テキスト フィールドに追加されます。
- デザイン エディタで、password テキスト フィールドを選択します。 [スマート エディタ] タブに、password テキスト フィールドの <h:inputText> タグの属性が表示されます。 [検証] セクションの [必須] チェック ボックスをチェックします。これにより、userId テキスト フィールド タグに required="true" 属性が追加されます。
- [
バリデータ] フィールドの横にあるアイコン をクリックします。 [バリデータの編集] ダイアログで [追加] ボタンをクリックし、[Long バリデータ] オプションを選択します。
- [長さバリデータ タグ] ダイアログの [Min. Value] フィールドに「1000」、[Max. Value] フィールドに「9999」と入力し、[OK] をクリックします。
- これにより、password テキスト フィールドのバリデータ一覧に、JSF の標準の [Long バリデータ] が追加されます。[OK] をクリックします。
JSF コア タグ ライブラリの <f:validateLongRange> タグが、password 入力テキスト フィールドに追加されます。
- その他のフォーム フィールド (name、city、zipcode、country など) についても、検証属性 [必須] のチェック ボックスをチェックします。
入力を必須にするフォーム フィールドには、記号 ( * ) を指定する必要があります。
- デザイン エディタで、userId 入力テキスト フィールドの後に記号 * を入力します。これにより、JSF コア タグ ライブラリからの <f:verbatim> に記号 * が追加されます。
- 記号 * を選択して CSS スタイル クラスを指定します。記号を右クリックし、ポップアップ メニューから [CSS スタイル クラス|html-text] を選択します。
![](images/img62.jpg)
- <span> タグによって、記号 * にスタイル クラス html-text が適用されます。
- その他のフォーム フィールド (password、name、address、city、zipcode、country など) についても、記号 * を追加してスタイル クラス html-text を適用します。
- register.jsp ページを保存します。
3.4.11. UI コンポーネント ラベルのローカライズ
国際化されたアプリケーションでは、GUI コンポーネント ラベルをローカライズする必要があります。ここでは、アプリケーション リソース バンドルを使用して、UI コンポーネント ラベルに動的な値をバインドします。
- workshop-jsf-tutorial/web/WEB-INF/src/java/resources/application.properties ファイルにフォーム フィールド ラベルのキーと値のペアを追加してファイルを保存します。このコード行は、workshop-JSF-tutorial/web/Typing_Aid/application_properties_1.txt からコピーすることもできます。
userId=User ID\: password=Password\: name=Name\: address=Address\: city=City\: state=State\: country=Country\: zipcode=Zipcode\: officePhone=Phone (Off.)\:
homePhone=Phone (Home)\:
submit=Submit
reset=Reset |
- [デザイン エディタ] で、[ユーザ ID] テキスト フィールドのラベルとして User Id: を選択します。[スマート エディタ] ビューには、User Id: テキスト ラベルの <h:outputText> タグの属性が表示されます。
- [スマート エディタ] タブで、[
値] フィールドの横にあるアイコン をクリックします。[バインディングの選択] ダイアログの [リソース] ビューで、リソース キーとして [userId] を選択して [OK] をクリックします。
- これにより、<h:outputText> タグの value 属性に、アプリケーション リソース バンドルのキー値 userId が動的にバインドされます。
- 同様の手順で、他の UI コンポーネント (password、name、address、city、state、zipcode、country、officePhone、homePhone、submit など) のラベルに、アプリケーション リソース バンドルの対応するキー値をバインドします。
- register.jsp ページを保存します。
3.4.12. JSP ページで使用できる変数の表示
Workshop では、JSP ページで使用できる変数が自動的に検出され、それらの変数を一覧から選択できます。これにより、開発時間を短縮し、エラーを最小限に抑えることができます。
- デザイン エディタで、userId テキスト フィールドを選択します。[ソース エディタ] ビューに、userId テキスト フィールド用に選択された <h:inputText> タグの属性が表示されます。
- userId テキスト フィールドの <h:inputText> タグのvalue属性から user.userId を削除して〔Ctrl〕+ スペース キーを押します。
JSP ページで使用できる変数の一覧が表示されます。
- userId テキスト フィールドの <h:inputText> タグの value 属性を #{user.userId} に設定しなおします。
3.4.13. JSF 管理対象 Bean のコード補完とエラー チェック
Workshop は、アプリケーション データベースを構築して、アプリケーションに関する情報を詳細に把握しています。これらの情報をもとに、JSF 管理対象 Bean の変数やメソッドのコード補完機能を提供します。
- デザイン エディタで、[送信] ボタンを選択します。[ソース エディタ] ビューに、[送信] ボタン用に選択された <h:commandButton> タグの属性が表示されます。
- [送信] ボタンの <h:commandButton> タグの action 属性からregisterUser を削除して〔Ctrl〕+ スペース キーを押します。
コード補完機能が起動し、管理対象 Bean UserBean のメソッドの一覧が表示されます。
- <h:commandButton> タグの action 属性を #{user.registerUser} に設定しなおします。
3.4.14. リアルタイムのエラー チェック
Workshop は、把握しているアプリケーションの分析をもとに、潜在的なエラーを即座に検出してリアルタイムでエラー チェックを行います。
Workshop では、エラーの影響を受けるすべてのファイルの警告/エラー マニフェストが作成されます。このマニフェストには、影響を受ける Java ファイルだけでなく、JSP および XML 関連のコンフィグレーション ファイルを始め、すべてのレベルのファイルが含まれます。
- たとえば、userId テキスト フィールドの <h:inputText> タグの value 属性を #{user.Id} に変更すると、ソース エディタに警告アイコンが表示されます。
- この状態で register.jsp ページを保存すると、管理対象 Bean beans.UserBean の Id フィールドが定義されていないことを示す警告メッセージが [問題] ビューに表示されます。
![](images/img66.jpg)
- value 属性を #{user.userId} に設定しなおします。
- 次に、UserBean クラスで、getPassword( ) メソッドの名前を getPass( ) に変更して UserBean クラスを保存してみます。
- [問題] ビューに、register.jsp リソースの警告メッセージとして、管理対象 Bean beans.UserBean の password フィールドが定義されていないことを示すメッセージが表示されます。
- UserBean クラスで、getPass( ) メソッドの名前を getPassword( ) に設定しなおして UserBean クラスを保存します。
チュートリアルを移動するには、矢印をクリックしてください。