いままでに勉強したStringとdrawStringの知識だけをつかってとりあえずできるところまでやります。
フォントの大きさは12。半角文字は高さが12ピクセル、幅が8ピクセルと推定しその値を使います。この値は大体でいいので何度か試すことにより容易にわかります。
paintComponentの一部だけを示します。
fillだけで描いていた棒にさらにdrawで枠を加えます。これは文字には関係ありませんが、文字のために色を指定したついでです。
棒の下にデータの連番をかきました。棒の真ん中になる様にしましたがこれもやりながら適当な位置を見つけることができます。
myg.setColor(c); myg.drawLine(left,yzero,left+dx*data.length,yzero); //x軸 myg.drawLine(left,yzero,left,top); //y軸 for(int i=0; data.length>i ; i++){ int w = (int)(dx*0.8) ; int h = (int)(data[i]*rate) ; int x = (int)(left+dx*i+(dx-w)/2) ; int y = yzero-h ; myg.setColor(cf); myg.fillRect(x,y,w,h); myg.setColor(c); myg.drawRect(x,y,w,h); //棒に輪郭をつける String text = Integer.toString(i); //データに連番をふる int half = text.length()*8/2; //1桁が8ピクセルと推定 myg.drawString(text,x+w/2-half,yzero+14); //文字の高さ12ピクセルと推定しこれに+2 } myg.setColor(c); int dy=100; //目盛の間隔 for(int y=0; 600>=y ; y+=dy){ //0, 100, ... 600 int ry = (int)(yzero-y*rate); //目盛線のy位置 myg.drawLine(left-4,ry,left,ry); //目盛線 String text = Integer.toString(y); //目盛の文字 int w = text.length()*8; //1桁が8ピクセルと推定 myg.drawString(text,left-w-6,ry+4); //目盛線より4ピクセル下げる }
2つめのforが縦軸の目盛のためです。これで 0, 100, 200, 300, 400, 500, 600 と目盛がつきます。本当はデータの値に応じて変更されるのがいいのですが、とりあえず妥協します。間隔の値にdyと変数を割り当てているのは将来データの値に応じて変更されることを想定してのことです。
最初の2行でx軸に目盛線をつけています。
目盛の縦位置はやはりrateをかけて出します。
メモのり文字は桁数が違っても右寄せしたいので、文字列に直して( .toString )から文字数を求め( .length )8をかけたものを幅(w)とし、leftからwだけ左から書いて( .drawString )います。6は隙間です。
目盛の数字の縦位置はやはりrateをかけて出しますが少し下げました。
上記プログラムをつくりなさい。
半角文字の高さが12ピクセル、幅が8ピクセルと推定しましたが、これをmyg(Graphicsクラスのインスタンス)から取得することができます。
横軸の目盛り
String text = Integer.toString(i);
//int half = text.length()*8/2;
int half = myg.getFontMetrics().stringWidth(text)/2;
int fh = myg.getFontMetrics().getHeight();
myg.drawString(text,x+w/2-half,yzero+fh);
halfは書く文字列の幅の半分をピクセルで表した数
myg はGraphicsクラスのインスタンスで、
myg.getFontMetrics() はGraphicsのメソッドでmygから情報を得るためのもの
.stringWidth()はFontMetricsクラスのメソッドで引数の文字列の印字幅をintで答える
Integer.toString(i)は引数。iというintの数値を文字列に変換したもの
fhは書く文字の高さ。.getHeight()はFontMetricsクラスのメソッドで文字の平均的な高さをintで答える
縦軸の目盛り
for(int y=0; 600>=y ; y+=dy){
int ry = (int)(yzero-y*rate);
myg.drawLine(left-4,ry,left,ry);
String text = Integer.toString(y);
//int w = text.length()*8;
int w = myg.getFontMetrics().stringWidth(text);
myg.drawString(text,left-w-6,ry+4);
}
戻り値 | メソッド | 機能 | 所属クラス |
---|---|---|---|
FontMetrics | getFontMetrics() | 現在のフォントのフォントメトリックを返します。 | java.awt.Graphics |
int | stringWidth(String str) | 指定された String を、この Font で表示するための有効幅の合計を返します。 | java.awt.FontMetrics |
int | getHeight() | このフォントのテキスト 1 行の標準の高さを取得します。 | java.awt.FontMetrics |