ウインドウの大きさが400x300ですから、データが300以上になる場合はグラフのスケールを調整しなければなりません。これを自動で行うようにします。また、データの数が増えたときも対応できるようにします。
ウインドウの大きさが400x300でない場合も最小限の変更でよいようにします。
import java.awt.*; import javax.swing.*; public class DrawRectG2 extends JFrame{ public DrawRectG2() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400,300); setTitle("グラフ"); MyPanel mypnl = new MyPanel(); mypnl.setSize(400,300); mypnl.setBackground(Color.white); setLayout(new BorderLayout()); add(mypnl, BorderLayout.CENTER); 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 top = 20; //topマージン int bottom= ph-50; //これだけマージンでなく位置 int left = 50; int right = 20; int dx = (pw-left-right)/data.length; //1項目の幅 double rate = (bottom-top)/max; //値*rate→パネル上の値 myg.setColor(c); myg.drawLine(left,bottom,left+dx*data.length,bottom); //x軸 myg.drawLine(left,bottom,left,top); //y軸 myg.setColor(cf); for(int i=0; data.length>i ; i++){ int w = (int)(..??..) ; int h = (int)(..??..) ; int x = (int)(..??..) ; int y = .....??.... ; myg.fillRect(x,y,w,h); } } } }
データの値が増えています。520でははみ出します。めんどうなので、データが越えない最大値をmaxとして設定します。
pw, ph はウインドウの大きさが400x300でない場合に、ここだけを直せばいいようにしたものです。(実際にはmypnl.setSize(400,300)なども直す必要があります)
データ数も増えています。1項目の幅を計算しdxに設定しています。
データの値がmaxのときに、パネル上の高さが(bottom-top)になるように、rateを設定します。
..??..の部分はpw,ph,top,bottom,....などの変数や数値をいれなければなりません。
(int)はdoubleなどの値をintの変数に代入するために値を変換するために使っています。fillRectの引数がintでなければならないからです。
(int)(10.0/3.0)では値は3になります。(int)10.0/3.0では10/3.0になってしまうのでintになりません。
上記プログラムを完成しなさい。
このプログラムではWindowをマウスで拡大したときグラフの大きさは変わらず、余白が広くなります。