ウインドウの大きさが400x300ですから、データが300以上になる場合はグラフのスケールを調整しなければなりません。これを自動で行うようにします。また、データの数が増えたときも対応できるようにします。
ウインドウの大きさが400x300でない場合も最小限の変更でよいようにします。
import java.awt.*; import javax.swing.*; public class DrawRectG2 extends JFrame{ public DrawRectG2() { 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){ DrawRectG2 myframe = new DrawRectG2(); } public class MyPanel extends JPanel{ double[] data={100, 40.5, 520, 360.4, 480.8, 250, 40, 82}; double max = 600; Color c = new Color(0,0,0); Color cf = new Color(128,128,128); public void paintComponent(Graphics myg){ super.paintComponent(myg); int pw = 400; //パネルの幅 int ph = 300; //パネルの高さ int yzero= ph-50; //これだけマージンでなく位置 int left = 50; //leftマージン int top = 20; //topマージン int right = 20; //rightマージン int dx = (pw-left-right)/data.length; //1項目の幅 double rate = (yzero-top)/max; //値*rate→パネル上の値 myg.setColor(c); myg.drawLine(left,yzero,left+dx*data.length,yzero); //x軸 myg.drawLine(left,yzero,left,top); //y軸 myg.setColor(cf); for(int i=0; data.length>i ; i++){ int w = (int)(..??..) ; int h = (int)(data[i]*rate) ; int x = (int)(..??..) ; int y = .....??.... ; myg.fillRect(x,y,w,h); } } } }
データの値が増えています。520でははみ出します。めんどうなので、データが越えない最大値をmaxとして設定します。
データの値がmaxのときに、パネル上の高さが(yzero-top)になるように、rateを設定します。
pw, ph はウインドウの大きさが400x300でない場合に、ここだけを直せばいいようにしたものです。(将来的には setPreferredSize の値で済ませます)
データ数も増えています。1項目の幅を計算しdxに設定しています。
..??..の部分はpw,ph,top,yzero,....などの変数や数値を使った計算式を入れなければなりません。下図を参考に x や w の値の関係をつかんでください。
(int)はdoubleなどの値をintの変数に代入するために値を変換するために使っています。fillRectの引数がintでなければならないからです。
(int)(10.0/3.0)では値は3になります。(int)10.0/3.0では10/3.0になってしまうのでintになりません。
このプログラムではWindowをマウスで拡大したときグラフの大きさは変わらず、余白が広くなります。
上記プログラムをつくりなさい。