今回は Controller の実装(一覧)。 これで Charts プラグインによる拡張は完了。 Controller に施す変更は以下の通り:
- paintGraph を JFreeChart によって実装
- y 軸を調整する adjustRange を実装
各処理を省略した Controller のコードはこんな感じ:
package functionplotter class FunctionPlotterController { def model def view def paintGraph = { // 後で実装 } def adjustRange = { // 後で実装 } def showLaf = {...} def showAbout = {...} }
paintGraph を JFreeChart によって実装
まずは paintGraph の処理の実装。 これはグラフを描画する処理で、以前のバージョンにもありました。 今回は JFreeChart の API を使ってこの処理を実装します。
具体的には、以前の記事「関数をプロットする」でみた Function2D を用いた方法を使いましょう。 ということで、まずは org.jfree.data.function.Function2D の実装クラスを作ります。 これは以前のバージョンでの Dynamo クラスに相当するものです(というか、ほとんどクラス名とメソッド名変えただけ)。
package functionplotter import org.jfree.data.function.Function2D class ScriptFunction2D implements Function2D{ static final GroovyShell SHELL = new GroovyShell() Script functionScript ScriptFunction2D(String function){ def expr = """ import static java.lang.Math.* import static org.apache.commons.math.util.MathUtils.* import static org.apache.commons.math.special.Beta.* import static org.apache.commons.math.special.Gamma.* import static org.apache.commons.math.special.Erf.* $function""" this.functionScript = SHELL.parse(expr) } @Override double getValue(double x){ functionScript.x = x return functionScript.run() } }
ここでも、java.lang.Math の static メソッドや commons-math に含まれている同様のクラスの static メソッドを自動インポートするようにしています。
Function2D の実装クラスができたので、これを使ってグラフを描画する処理を描きましょう。 手順は
- Function2D オブジェクトを作成する
- DatasetUtilities#sampleFunction2D() メソッドを用いて Dataset オブジェクトを作成する
- チャートに Dataset オブジェクトをセットする
import org.jfree.data.general.DatasetUtilities ... def paintGraph = { evt = null -> def func = new ScriptFunction2D(model.function) def dataset = DatasetUtilities.sampleFunction2D(func, model.from, model.to, model.samples, 'f(x)') view.coordinate.chart.plot.dataset = dataset }
- Function2D オブジェクトを生成する際に Model の function プロパティ(関数式)を使用しています
- Dataset オブジェクトを生成する際に Function2D オブジェクトと Model の from, to, samples プロパティを使用しています
- Dataset オブジェクトをセットするチャートは View から coordinate プロパティ(View で chart ノードの id に設定した文字列)によって取得します。 返されるオブジェクトは ChartPanel オブジェクトになっています(JFreeChart オブジェクトではない!)。 したがって、さらに chart プロパティによって JFreeChart オブジェクトを取得します。
もとのコードを考えたら、たった3行で書けるなんて感激!
y 軸を調整する adjustRange を実装
次は y 軸の範囲を指定された値に設定する adjustRange。 以前のバージョンと変わってこの処理を別にしているのは y 軸の範囲を変更するだけなら上記の paintGraph の処理のような関数評価が必要ないからです。 JFreeChart で y 軸の範囲を変えるには、チャートから単に y 軸 (RangeAxis) を取得して適切なプロパティの値を設定するだけで OK です:
def adjustRange = { evt = null -> view.coordinate.chart.plot.rangeAxis.with{ lowerBound = model.min upperBound = model.max } }
省エネ、バンザイ:-)
上記の変更を施して、アプリケーションを実行し、グラフを描画するとこんな感じ:
目盛りやグリッドが自動で入ってくれるのがいいですねぇ。 とりあえずこれで Charts プラグイン完了。
Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)
- 作者: チェット・ハーゼ,ロマン・ガイン,Chet Haase,Romain Guy,松田晃一,小沼千絵
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/26
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 42回
- この商品を含むブログ (20件) を見る