ウインドウの大きさが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をマウスで拡大したときグラフの大きさは変わらず、余白が広くなります。
