倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

はじめての幻獣 Griffon 研 (15) : Charts プラグインでグラフを描画する (4) : Controller

今回は 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 の実装クラスができたので、これを使ってグラフを描画する処理を描きましょう。 手順は

  1. Function2D オブジェクトを作成する
  2. DatasetUtilities#sampleFunction2D() メソッドを用いて Dataset オブジェクトを作成する
  3. チャートに 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)

Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)

  • 作者: チェット・ハーゼ,ロマン・ガイン,Chet Haase,Romain Guy,松田晃一,小沼千絵
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/11/26
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 42回
  • この商品を含むブログ (20件) を見る