2015年10月9日 星期五

JFreeChart (Struts2.3.x 十三)

首先先去這個網站下載
下載後打開jfreechart-1.x.x-demo.jar

打開後,找一個自己喜歡的,然後在source資料夾搜尋你選到的檔名,就有原始檔可看,直接複製到Eclipse,即可得到和畫面一樣的結果

這裡模擬一個較簡單的
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Samsung", new Double(27.8));
dataset.setValue("Others", new Double(55.3));
dataset.setValue("Nokia", new Double(16.8));
dataset.setValue("Apple", new Double(17.1));
JFreeChart jfc = ChartFactory.createPieChart("Phone Person", dataset);
try {
    ChartUtilities.saveChartAsJPEG(new File("D:/test.jpg"), jfc, 800, 600);
    System.out.println("成功!");
} catch (IOException e) {
    e.printStackTrace();
    System.err.println("失敗!");
}

setValue(Comparable, Number)
Comparable的兒子包括8個基本型別的Wrapper類別,還有String、Date都是

以上設定如果有中文,也不會出錯,但中文會變成「□」,所以要增加了以下的方法:
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("象棋", 12);
dataset.setValue("跳棋", 25);
dataset.setValue("五子棋", 30);
dataset.setValue("孔明棋", 5);

// 中文標題
JFreeChart jfc = ChartFactory.createPieChart("棋類使用率圖", dataset);
jfc.getTitle().setFont(new Font("標楷體", Font.BOLD, 28));

// 圖裡的中文
PiePlot plot = (PiePlot) jfc.getPlot();
plot.setLabelFont(new Font("微軟正黑體", Font.PLAIN, 16));

// 圖底的中文
jfc.getLegend().setItemFont(new Font("新細明體", Font.ITALIC, 20));
try {
    ChartUtilities.saveChartAsJPEG(new File("D:/test.jpg"), jfc, 800, 600);
    System.out.println("成功!");
} catch (IOException e) {
    e.printStackTrace();
    System.err.println("失敗!");
}


如果本機沒有對應的字體也不會報錯,看起來是有預設的字體

※在Struts2裡使用JFreeChart

1.首先要有jfreechart-1.x.x.jar,還有Struts2合併JFreeChart的struts2-jfreechart-plugin-2.x.x.jar

2.struts.xml
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />

<package name="basicstruts2" extends="struts-default"
    namespace="/">
    <result-types>
        <result-type name="chart"
            class="org.apache.struts2.dispatcher.ChartResult">
            <param name="height">200</param>
            <param name="width">200</param>
        </result-type>
    </result-types>
</package>

3.JFreeChartAction.java
@ParentPackage("basicstruts2")
@Namespace("/struts2")
@Action("picture")
@Results({ @Result(name = "success", type = "chart") })
public class JFreeChartAction extends ActionSupport {
    private JFreeChart chart;

    public JFreeChart getChart() {
        return chart;
    }

    public String productPic() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("象棋", 12);
        dataset.setValue("跳棋", 25);
        dataset.setValue("五子棋", 30);
        dataset.setValue("孔明棋", 5);

        // 中文標題
        chart = ChartFactory.createPieChart("棋類使用率圖", dataset);
        chart.getTitle().setFont(new Font("標楷體", Font.BOLD, 28));

        // 圖裡的中文
        PiePlot plot = (PiePlot) chart.getPlot();
        plot.setLabelFont(new Font("微軟正黑體", Font.PLAIN, 16));

        // 圖底的中文
        chart.getLegend().setItemFont(new Font("新細明體", Font.ITALIC, 20));
        try {
            ChartUtilities.saveChartAsJPEG(new File("D:/test.jpg"), chart, 200,
                    200);
            System.out.println("成功!");
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("失敗!");
        }
        return SUCCESS;
    }
}

在瀏覽器輸入http://localhost:8080/Struts2Demo/struts2/picture!productPic.action即可看到畫面
struts.xml裡的寬高是瀏覽器看到的寬高
JFreeChartAction.java的寬高是輸出檔案的寬高
我試的結果,名字一定要叫chart,不然會報錯

官方也有提供做法,但有地方要修改如下:
struts.xml不用動
ViewModerationChartAction.java因為沒有RandomUtils,所以改成以下:
Random random = new Random();
for (int i = 0; i <= 100; i++) {
    dataSeries.add(i, random.nextInt());
}

return SUCCESS即可,不用super,這樣就能產生報表了

其他更深入的寫法,就看JFreeChart官方網站了,它的教學指南是要花錢買的

沒有留言:

張貼留言