<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<head>
	</head>
	<body>
		<p>この章では、BESPに添付されているいくつかのプレゼンテーションコンポーネントで、サンプルとして紹介できるものについて、解説します。</p>
		<subsection title="チュートリアル用サンプルプレゼンテーションコンポーネント">
			<p>
				org.boxed_economy.marketforlemonに置かれているプレゼンテーションコンポーネントについては、ここまでの章で紹介しているので割愛します。</p>
		</subsection>
		<subsection title="板寄せ市場用プレゼンテーションコンポーネント">
			<p>
				org.boxed_economy.artificialmarket.presentationに収録されているプレゼンテーションコンポーネントです。</p>
			<subsubsection title="板表示プレゼンテーションコンポーネント">
				<p>
					クラス名：org.boxed_economy.artificialmarket.presentation.BoardPresentationComponent</p>
				<p>
					板寄せ市場における投資家の注文状況を約定板として表示するプレゼンテーションコンポーネントです。板の情報をUpdateClockEventを受け取る度に表形式で表示します。Swingでは、この表の表示に関してはTableModelを用いるのが一般的なのでそのためのインナークラスを持ちます（このインナークラスの詳細についてはSwingの領域のため、ここでは割愛させていただきます。）。</p>
				<p>情報の取得は以下のように行います。</p>
				<program title="BoardPresentationComponent"
					src="artificialmarketsrc/presentation/BoardPresentationComponent.java"
					javasrcKeyword="void clockGained" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<program title="BoardPresentationComponent"
					src="artificialmarketsrc/presentation/BoardPresentationComponent.java"
					javasrcKeyword="BoardInformation getBoard"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<p>
					このように、時計が更新される度にboard変数を更新するだけです。TableModelでは常にこのboard変数を参照して最新の情報を描画します。</p>
				<program title="TableModel"
					src="artificialmarketsrc/presentation/BoardPresentationComponent.java"
					javasrcKeyword="class BoardTableModel" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
			</subsubsection>
			<subsubsection title="グラフ表示プレゼンテーションコンポーネント">
				<p>
					板における価格と取引量を表示するためのDataCollectorです。このプレゼンテーションコンポーネントはorg.boxed_economy.artificialmarket.presentation.StepClockDataCollectorとそれを継承したorg.boxed_economy.artificialmarket.presentation.ArtificialMarketDataCollectorから構成されています。StepClockDataCollectorでは、DataCollectorのうち、ClockがStepClockである場合に時系列にグラフを表示させるための処理をあらかじめ用意してあります。もし、コンポーネント作成者がこのようなDataCollectorを作成した場合、このクラスを継承することで、コードを書く量を少なくすることができるでしょう。</p>
				<program title="StepClockDataCollector"
					src="artificialmarketsrc/presentation/StepClockDataCollector.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<p>
					グラフモデルを管理するメソッドであるaddGraphModel()、removeGraphModel()、resetGraphModel()を用意していますが、あとはDataCollectorとして必要な処理はあらかじめ記述してあります。継承したクラスにおいて
					clockGain(long step)を実装するだけのクラスをデザインしました。</p>
				<p>そして、ここではArtificialMarketDataCollectorでは、このように実装しています。</p>
				<program title="ArtificialMarketDataCollector"
					src="artificialmarketsrc/presentation/ArtificialMarketDataCollector.java"
					javasrcKeyword="void clockGain" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					getBoardメソッドの処理は既出したものと同じです。あとは、このクラスで管理しているグラフモデルを更新する処理のみです。このように、StepClockDataCollectorを継承することで、グラフモデルの管理のみを行えばいいようになっています。</p>
			</subsubsection>
		</subsection>
		<subsection title="シュガースケープ用プレゼテーションコンポーネント">
			<p>
				org.boxed_economy.sugarscape.presentationに収録されているプレゼンテーションコンポーネントです。</p>
			<subsubsection title="シュガースケープフィールド表示コンポーネント">
				<p>
					クラス名：org.boxed_economy.sugarscape.presentation.SSPresentationComponent</p>
				<p>
					このプレゼテーションコンポーネントはグラフィカルにシュガースケープの状況を表示します。ただし、前述したように描画のためのパネルクラスは分離させています。それが、org.boxed_economy.sugarscape.presentation.SSFieldPanelです。</p>
				<p>このようにすることで、SSPresentationComponentはモデル読み込み時の初期化処理を行っています。</p>
				<program title="モデル読み込み時の処理"
					src="sugarscapesrc/presentation/SSPresentationComponent.java"
					javasrcKeyword="void worldOpened" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					ここでの肝心な部分がorg.boxed_economy.sugarscape.presentation.SSFieldPanelです。このプレゼンテーションコンポーネントは、エージェント及び砂糖の描画処理を行いますが、org.boxed_economy.components.cell.CellFieldPanelを継承して作成しています。こうすることで、エージェントの描画処理（エージェントの座標取得など）を簡単にしています。このCellFieldPanelクラスは、モデル・チュートリアルのところでも述べたCellパッケージに含まれる部品です。このクラスはJPanelを継承しているので、Panelとしての処理に加えて、Panelの格子の描画処理やデータの妥当性などのチェックを行いますが、エージェントやその他の要素の描画はこのクラスを継承したクラスに依存します（この点についての詳細はCellパッケージのAPIをご覧下さい）。このため、SSFieldPanelクラスにはエージェントを描画する処理と砂糖のデータを持ち、それを背景として描画する仕組みを実装しています。</p>
				<program title="エージェントを描画するメソッド"
					src="sugarscapesrc/presentation/SSFieldPanel.java"
					javasrcKeyword="void drawAgents" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					エージェントの描画に関しては、各セルにエージェントが存在しているかを調べて青丸を描画します。このための空間情報はCellFieldPanel.getCellSpaceメソッドによって取得できます。</p>
				<program title="砂糖を背景として描画するメソッド"
					src="sugarscapesrc/presentation/SSFieldPanel.java"
					javasrcKeyword="void drawBackGround" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					砂糖の描画に関しても各セルの砂糖の量を調べて。濃淡のある黄色を描画するだけです。ただし、そのためのSSFieldInformationクラスをあらかじめこのプレゼンテーションコンポーネントの生成、及びモデルの更新時に与える必要があります。</p>
			</subsubsection>
		</subsection>
	</body>
</doc>
