今からはじめるプログラミング29

電卓に円グラフを作ってみたけれど

実際にグラフの使い方がイマイチわからなかった?

かもしれないので、グラフの使い方をもう少し。

というか使えるプログラムも書かないと、

意味がない。(なんというか自動で自分の投資とかのデータを管理したい)

というわけで、まずグラフのサンプルを覗いてみる。(プログラムベースの考えかたですいません。)

Oracleさんのページあるさんぷるです(どうせなら最新?のJavaFXです。)↓

32 折れ線グラフ(リリース8)

 

このサンプルのコードをとりあえずそのままEclipseに取り込んでみる。

といっても、空のクラスをつくって、そこにコピペして、クラス名をRefucterからリネームして、パッケージなどのエラーに対応しただけ。

そして実行。

サイトと同じグラフが表示される。(あたりまえですかね)

プログラムをみて、何がグラフを構成している要素なのか、分析する。

グラフの「データ」を構成している部分は、

----------------------

series.getData().add(new XYChart.Data(1, 23));

----------------------

のコードだろうと当たりをつける。

この時点で、ここのコードを普通はデータベースとか、別途保存したファイルなどから生成していくようにすれば、いいのかな?と考える。

なので?

ループに変更して、実験。

-------------------------

        //populating the series with data

//        series.getData().add(new XYChart.Data(1, 23));

//        series.getData().add(new XYChart.Data(2, 14));

//        series.getData().add(new XYChart.Data(3, 15));

//        series.getData().add(new XYChart.Data(4, 24));

//        series.getData().add(new XYChart.Data(5, 34));

//        series.getData().add(new XYChart.Data(6, 36));

//        series.getData().add(new XYChart.Data(7, 22));

//        series.getData().add(new XYChart.Data(8, 45));

//        series.getData().add(new XYChart.Data(9, 43));

//        series.getData().add(new XYChart.Data(10, 17));

//        series.getData().add(new XYChart.Data(11, 29));

//        series.getData().add(new XYChart.Data(12, 25));

        for(int i=1;i<10;i++)

    {

        series.getData().add(new XYChart.Data(i, i*10));

        }

-------------------------

for分は、連続データの作成に便利ですね。。。

というわけで実行すると

想定通りの右上がりのグラフが表示される。

f:id:yo2an:20210710143209p:plain

グラフサンプル

変更箇所が、生データのプログラムということで問題なさそうです。

なので、この部分を、外部(DBとかファイル、もしくはWEBからでもいいですね。)から調達するようにすれば、自分の欲しいグラフデータを作れそうです。

DBは、準備してないので、ファイルを読み込みつつグラフを作るように修正しよう。

まず、フォルダにファイルを用意。

-------------------------

+dat                                               ・・・フォルダ      

 - 2021_06_01.txt                            ・・・データのファイル

 - 2021_06_02.txt                                 ファイル名のフォーマット

 - 2021_06_03.txt                                yyyy_mm_dd.txt

---------------------------

ファイルの中身は、数値(株価?とか相場?とか)

ということを想像。(設計ですね。甚だ簡単ですが。)

というわけで実装は以下のような感じ。。。。

LineChartSample(改修後)

----------------------------

package sample14;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

 

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.chart.LineChart;

import javafx.scene.chart.NumberAxis;

import javafx.scene.chart.XYChart;

import javafx.stage.Stage;

 

public class LineChartSample extends Application {

 

/***

*

* @param flg is 1=year 2=month 3= day TODO 4=hour

*****/

public List getInputData(int flg) throws IOException {

File datas = new File("./dat").listFiles();

List dataList = new ArrayList();

FileReader fr = null;

BufferedReader br = null;

int cnt = datas.length;

for(int i=0;i<cnt;i++) {

File fileData = datas[i];

fr = new FileReader(fileData);

br = new BufferedReader(fr);

String data = br.readLine();

String fileName = fileData.getName();

System.out.println(fileName);

 

if(flg==1) {

//年

String yr = fileName.substring(0, 4);

String strData = {yr,data};

dataList.add(strData);

}else if(flg==2){

//月

String mth = fileName.substring(6, 7);

String strData = {mth,data};

dataList.add(strData);

 

}else {

//日

String dy = fileName.substring(8, 10);

String strData = {dy,data};

dataList.add(strData);

 

}

br.close();

fr.close();

}

 

return dataList;

}

    @Override public void start(Stage stage) {

        stage.setTitle("Line Chart Sample");

        //defining the axes

        final NumberAxis xAxis = new NumberAxis();

        final NumberAxis yAxis = new NumberAxis();

        xAxis.setLabel("Number of Month");

        //creating the chart

        final LineChart<Number,Number> lineChart =

                new LineChart<Number,Number>(xAxis,yAxis);

                

        lineChart.setTitle("Stock Monitoring, 2010");

        //defining a series

        XYChart.Series series = new XYChart.Series();

        series.setName("My portfolio");

        //populating the series with data

        

        try {

List data = getInputData(3) ;

int dataCnt = data.size();

for(int idx =0;idx<dataCnt;idx++) {

String strData = (String)data.get(idx);

series.getData().add(

new XYChart.Data(

Integer.parseInt(strData[0]),

Integer.parseInt(strData[1])));

 

}

 

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

        

        Scene scene  = new Scene(lineChart,800,600);

        lineChart.getData().add(series);

       

        stage.setScene(scene);

        stage.show();

    }

 

    public static void main(String[] args) {

        launch(args);

    }

}

 

----------------------------

どうでしょうか?

 

リソースとなるファイルは別途プログラムを作成するか、バッチなどで収集するようにして、またアプリケーション的には「更新」ボタンでグラフを更新するような感じにさらに改造、また範囲を絞れるようにすれば、かなりきちんとしたアプリケーションになりそうです。

 

バグや回収箇所がかなり残りますが。。。。こんな感じでいかがでしょうか?だれに?聞いているのだろうかw

 

 

Excelのが簡単?・・・ですよねぇー・・・