今からはじめるプログラミング29
電卓に円グラフを作ってみたけれど
実際にグラフの使い方がイマイチわからなかった?
かもしれないので、グラフの使い方をもう少し。
というか使えるプログラムも書かないと、
意味がない。(なんというか自動で自分の投資とかのデータを管理したい)
というわけで、まずグラフのサンプルを覗いてみる。(プログラムベースの考えかたですいません。)
Oracleさんのページあるさんぷるです(どうせなら最新?のJavaFXです。)↓
このサンプルのコードをとりあえずそのまま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分は、連続データの作成に便利ですね。。。
というわけで実行すると
想定通りの右上がりのグラフが表示される。
変更箇所が、生データのプログラムということで問題なさそうです。
なので、この部分を、外部(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.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のが簡単?・・・ですよねぇー・・・