- PR -

Graphics2Dクラスを利用して、グラフ作成をしているのですが、

1
投稿者投稿内容
ちゃこ
会議室デビュー日: 2003/06/18
投稿数: 5
投稿日時: 2005-09-10 15:02
いつも、お世話になっております。

体重測定をした結果をグラフにする
という作業をしています。

Graphics2Dクラスのオブジェクトで
データベースから取得した値を
px単位で表示をしているのですが、
数値と数値間が少ないと、
刻みが狭すぎて、見づらいグラフになってしまいます。

取得した値に幅を取ろうと思って、
値をプラスしても値の幅が変わらないので
どうしたらよいのか教えて頂けたら幸いです。

どうか宜しくお願い致します。


public BufferedImage getGraphWeekWeight(int pp, int cal_y, int cal_m, int cal_d, float[][] vv, int maxWeight, int aimWeight, int currentWeight, int w, int h) throws Exception {

SevenDaysFactory sdf = new SevenDaysFactory();
List dt = sdf.getSevenDayList(pp, cal_y, cal_m, cal_d);
String week[] = new String[]{"(日)","(月)","(火)","(水)","(木)","(金)","(土)"};

int px=0;
int py=0;

int xx = 0;

//BufferedImageオブジェクトを作成する(8ビットRGB)
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

//Graphicsオブジェクトを作成する
Graphics2D g = img.createGraphics();

//背景を塗りつぶす
g.setColor(Color.white);
g.fillRect(0, 0, w, h);

//文字のフォントを設定します
Font f1 = new Font("Monospaced", Font.PLAIN,12);
Font f1b = new Font("SansSerif", Font.PLAIN,13);

g.setFont(f1);

//矩形の輪郭を描きます
g.setColor(new Color(204,204,204)); // グレー
g.drawRect(px+29,py,588,175);

//縦の直線を引きます
for (int i=1; i<7; i++) {
g.drawLine(px+29+(i*84),py,px+29+(i*84),py+175);
}

//横の直線を引きます
g.drawLine(px+29,py+25,px+617,py+25); //日付用
g.drawLine(px+29,py+155,px+617,py+155); //データ用

//目標体重の入力での現在の体重ライン決め
int currentLine = 185 - currentWeight;
g.drawLine(px+29,py+currentLine,px+617,py+currentLine); //現在の体重ライン

//点線を引くために基本情報を設定します
Stroke stroke = new BasicStroke(1, // 太さ10
BasicStroke.CAP_BUTT, // 端は残す
BasicStroke.JOIN_MITER, // 継ぎ目は斜め
2.0f, // 継ぎ目の限界
new float[] {2.0f, 2.0f}, // 10書いて5書かないダッシュ
0.0f); // ダッシュの開始フェーズ

//Graphicsオブジェクトに点線の情報をセットします
g.setStroke(stroke);

//横の点線を引きます
//g.drawLine(px+29,py+35,px+617,py+35); //体重データの10kg増し
//g.drawLine(px+29,py+85,px+617,py+85); //現在の体重を引きたい場所
//g.drawLine(px+29,py+135,px+617,py+135); //目標体重を引きたい場所

//一番上の線
int maxLine = 185 - maxWeight - 50;
g.drawLine(px+29,py+maxLine,px+617,py+maxLine);

//目標体重ライン
int aimLine = 185 - aimWeight;
g.setColor(new Color(255,51,51)); // 赤
//g.drawLine(px+29,py+aimLine+aimWeight,px+617,py+aimLine+aimWeight); //目標体重ライン
g.drawLine(px+29,py+aimLine,px+617,py+aimLine); //目標体重ライン

g.setStroke(new BasicStroke(1f));

//指定された矩形を塗りつぶします(日付)
g.setColor(new Color(220,241,254)); // 水色
for (int i=0; i<7; i++) {
g.fillRect(px+30+(i*84),py+1,83,24);
}

//フォントの情報をセットします
g.setFont(f1b);

//日付を書きます
g.setColor(new Color(11,42,92)); // 紺色
for (int i=0; i<7; i++) {
g.drawString(Integer.parseInt(dt.get(i).toString().substring(5,7)) + "/"
+ Integer.parseInt(dt.get(i).toString().substring(8,10)) + week[i],
px+48+(i*84), py+18);
}

//縦軸に文字を書きます
g.setColor(Color.black);
g.setFont(f1);
g.drawString(Integer.toString(maxWeight+50), px+12, py+maxLine);
g.drawString(Integer.toString(currentWeight), px+12, py+currentLine); //現在の体重値
g.drawString(Integer.toString(aimWeight), px+12, py+aimLine); //目標体重値
g.drawString(Integer.toString(currentWeight-10), px+12, py+157);

//取得したデータを書きます
for (int i=0; i<7; i++) {
if (vv[0][i]!=0) {
g.drawString(Float.toString(vv[0][i]), px+29+(i*84)+25, py+170);
}
}

int mx=0; int my=0;
int cx=0; int cy=0;

//折れ線
g.setColor(new Color(204,204,204)); // グレー
for (int i=0; i<7; i++) {
if (vv[0][i]!= 0) {
cx = px+70+(i*84);
cy = (int) (py+185-vv[0][i]);
if (mx!=0) {
g.drawLine(mx,my,cx,cy);
}
mx=cx;
my=cy;
}
}

//点
g.setColor(new Color(255,51,102));
for (int i=0; i<7; i++) {
if (vv[0][i]!= 0) {
g.fillRect(px+68+(i*84),(int) (py+184-vv[0][i]),3,3);
}
}

//Graphicsオブジェクトを破棄する
g.dispose();

return img;
}

1

スキルアップ/キャリアアップ(JOB@IT)