2007年11月7日水曜日

ZK + Seasar: JFreeChart

今は見当たりませんが、以前ZKサイトのSmalltalksにあったパイチャートデモを参考に東京の月別降雨量をパイチャートで表示するアプリを作ってみました。データベースにはs2jdbcでアクセスします。
  • テーブル作成
    データベースが起動していないときはDatabaseViewでzkseasarプロジェクトをクリックしデータベースを起動します。次にブラウザでlocalhost:8082へアクセスしH2 Consoleを開きデータベースに接続します。SQLステートメントに下記のSQLをコピーし実行するとテーブルが作成されサンプルデータが登録されます。

    create table rain_stats(
    year integer,
    month char(3),
    rainfall decimal(4, 1)
    );

    insert into rain_stats values(2003, '1月', 101.0);
    insert into rain_stats values(2003, '2月', 53.5);
    insert into rain_stats values(2003, '3月', 159.5);
    insert into rain_stats values(2003, '4月', 121.0);
    insert into rain_stats values(2003, '5月', 172.5);
    insert into rain_stats values(2003, '6月', 85.0);
    insert into rain_stats values(2003, '7月', 187.5);
    insert into rain_stats values(2003, '8月', 370.0);
    insert into rain_stats values(2003, '9月', 150.0);
    insert into rain_stats values(2003, '10月', 171.5);
    insert into rain_stats values(2003, '11月', 229.5);
    insert into rain_stats values(2003, '12月', 53.0);
    insert into rain_stats values(2004, '1月', 3.5);
    insert into rain_stats values(2004, '2月', 20.0);
    insert into rain_stats values(2004, '3月', 129.5);
    insert into rain_stats values(2004, '4月', 69.5);
    insert into rain_stats values(2004, '5月', 149.0);
    insert into rain_stats values(2004, '6月', 112.5);
    insert into rain_stats values(2004, '7月', 23.5);
    insert into rain_stats values(2004, '8月', 79.5);
    insert into rain_stats values(2004, '9月', 195.0);
    insert into rain_stats values(2004, '10月', 780.0);
    insert into rain_stats values(2004, '11月', 108.5);
    insert into rain_stats values(2004, '12月', 79.5);
    insert into rain_stats values(2005, '1月', 77.0);
    insert into rain_stats values(2005, '2月', 48.0);
    insert into rain_stats values(2005, '3月', 71.0);
    insert into rain_stats values(2005, '4月', 81.0);
    insert into rain_stats values(2005, '5月', 180.5);
    insert into rain_stats values(2005, '6月', 170.5);
    insert into rain_stats values(2005, '7月', 247.5);
    insert into rain_stats values(2005, '8月', 189.5);
    insert into rain_stats values(2005, '9月', 177.5);
    insert into rain_stats values(2005, '10月', 201.5);
    insert into rain_stats values(2005, '11月', 34.5);
    insert into rain_stats values(2005, '12月', 3.5);


  • エンティティRainStatsを作成する。

    package zkseasar.entity;

    import java.math.BigDecimal;
    import javax.persistence.Entity;
    import javax.persistence.Table;

    @Entity
    @Table(name = "RAIN_STATS")
    public class RainStats {
    public Integer year;

    public String month;

    public BigDecimal rainfall;
    }


  • サービスRainStatsServiceを作成する。

    package zkseasar.service;
    import java.util.List;
    import org.seasar.extension.jdbc.JdbcManager;
    import zkseasar.entity.RainStats;

    public class RainStatsService {
    public JdbcManager jdbcManager;

    public List<RainStats> selectAll(String year) {
    return jdbcManager.from(RainStats.class)
    .where("year = ?", year)
    .getResultList();
    }

    }


  • rainfall.zulを作成する。

    <?xml version="1.0" encoding="UTF-8"?>
    <?variable-resolver class="org.zkoss.zkplus.seasar.DelegatingVariableResolver"?>
    <zk xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd ">
    <window title="東京 年間降雨量デモ" width="500px" border="normal">
    年度:
    <listbox id="yr" rows="1" mold="select" onSelect="processYear(self.selectedItem.label)">
    <listitem label="2005" selected="true"/>
    <listitem label="2004"/>
    <listitem label="2003"/>
    </listbox>
    <vbox>
    <chart id="mychart" title="月別降雨量 (mm)" width="500" height="250" type="pie" threeD="false" fgAlpha="128"/>
    <checkbox label="3D チャート" checked="false" onCheck="mychart.setThreeD(self.isChecked())"/>
    </vbox>
    <zscript>
    model = new SimplePieModel();

    // 年を指定してパイチャートを表示
    void processYear(String year) {
    model.clear();
    rainStats = rainStatsService.selectAll(year);
    for(data: rainStats){
    model.setValue(data.month, data.rainfall);
    }
    mychart.setModel(model);
    }
    // デフォルトは最新の年
    processYear("2005");
    </zscript>
    </window>
    </zk>


  • localhost:8080/zkseasar/view/rainfall.zulへアクセスする。


    当初パイチャートの日本語が文字化けしていました。OSはFedora Core6です
    http://blog.goo.ne.jp/koregaiya/e/ac4c0c130df9fa8ef0cf7e31be71671aを参考にして文字化けを解消することが出来ました。コマンドだけ書いておきます。

    # cd $JAVA_HOME/jre/lib/fonts
    # mkdir fallback
    # cd fallback
    # ln -s /usr/share/fonts/japanese/TrueType/ipagp.ttf kochi-gothic-subst.ttf
    # ln -s /usr/share/fonts/japanese/TrueType/ipamp.ttf kochi-mincho-subst.ttf

  • 0 件のコメント: