次のような棒グラフをつくります。
import java.awt.*; import javax.swing.*; public class DrawRectG extends JFrame{ public DrawRectG() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("グラフ"); setLayout(new BorderLayout()); MyPanel mypnl = new MyPanel(); add(mypnl, BorderLayout.CENTER); mypnl.setBackground(Color.white); mypnl.setPreferredSize(new Dimension(400,300)); pack(); setVisible(true); } public static void main(String[] args){ DrawRectG myframe = new DrawRectG(); } public class MyPanel extends JPanel{ int[] data={10,40,120,60,80}; int yzero=250; int left =50; int top =50; int dx = 50; public void paintComponent(Graphics myg){ super.paintComponent(myg); myg.setColor(new Color(0,0,0)); myg.drawLine(x1,y1,x2,y2); //x軸 myg.drawLine(x1,y1,x2,y2); //y軸 myg.setColor(new Color(0,0,255)); for(int i=0; data.length>i ; i++){ myg.fillRact(x,y,w,h); } } } }
paintComponent()内は未完成です。drawLineのx1,y1,x2,y2や fillRectのx,y,w,hは別の値やyzero,left,dx,data[i]を使った式に置き換えなければなりません。
一番外側のJFrameはsetSize()で大きさを指定していましたが、それでは中に入るJPanelがそれより小さくなります。
グラフを描くにあたりパネルの大きさを指定したいのでsetPreferredSize()を使いました。大きさはDimensionというクラスを使いますが、上記のように書けば400x300になります。
pack()をすればパネルに合わせてフレームの大きさをあわせてくれます。
プログラムの中に定数として yzero, left, top を書いていますが意味は次の図のとおりです。
int yzero=250; int left =50; int top =50;
y軸は次のようにすればできます。
myg.drawLine(left,top,left,yzero); //y軸
グラフにするデータはdata[]に入っていてその数はdata.lengthです。
x軸の右端は一つの棒の領域幅をdxとしてデータ数分あればいいので次のようにすればできます。
myg.drawLine(left,yzero,left+dx*data.length,yzero); //x軸
データ数はdata.lengthですから、繰り返しはforを使います。
for(int i=0; data.length>i ; i++){
最初のデータの棒を描く横位置はy軸よりちょっと右がいいでしょう。
myg.fillRect(left+10+dx*i,top,dx/2,data[i]);
棒を描く横位置はdxずつ右によせて行かないと重なってしまいます。i が0から始まりますから一番最初は left+10 で好都合です。
myg.fillRect(left+10+dx*i,top,dx/2,data[i]);
棒を描く縦位置はちょっと難しいのでとりあえず top にします。これは後で変更します。
myg.fillRect(left+10+dx*i,top,dx/2,data[i]);
棒の幅はdxの半分にしましょう。
myg.fillRect(left+10+dx*i,top,dx/2,data[i]);
棒の高さはdata[i]にしましょう。最大で120ですから、そのまま描いてもはみ出しません。
myg.fillRect(left+10+dx*i,top,dx/2,data[i]);
棒の高さはdata[i]でいいのですが、棒を描く縦位置を変更しなければなりません。次の図を参考に変更しなさい。
上記プログラムをつくりなさい。