緑だけの配色でしたが,赤と青を加えて変化をつけます。
ボタンを3つにしました。いままでBorderLayout()やGridLayout()を使ってきましたが, 今回はひとつのレイアウトマネージャーでやるのは面倒です。
JavaではJPanelなどにボタンやラベルを配置することができます。そこで3つのボタンをJPanelにならべて, それをMyPanelと組み合わせることにします。
JPanelは特に大きさを指定していませんが中に入れたボタンの大きさとそのレイアウトにしたがって自動で細長くなります。
public EventRandomRGB() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("イベントで変化する模様"); mypnl = new MyPanel(400,300); rbtn = new JButton("red"); gbtn = new JButton("green"); bbtn = new JButton("blue"); JPanel btnpnl = new JPanel(); btnpnl.setLayout(new GridLayout(1,3,0,0)); btnpnl.add(rbtn); btnpnl.add(gbtn); btnpnl.add(bbtn); setLayout(new BorderLayout()); add(mypnl, BorderLayout.CENTER); add(btnpnl,BorderLayout.SOUTH); rbtn.addActionListener(this); gbtn.addActionListener(this); bbtn.addActionListener(this); pack(); setVisible(true);
mybtn の代わりに rbtn など3つのボタンをフィールドで宣言する必要があります。btnpnl の名前はコンストラクタ以外では使わないのでコンストラクタないで宣言しています。
上記の様にActionListenerも必要です。
ボタンを3つにしましたのでそれぞれに何をするかをかきます。
public void actionPerformed(ActionEvent e) { if (e.getSource() == rbtn) { mypnl.drawToBuff('r'); } if (e.getSource() == gbtn) { mypnl.drawToBuff('g'); } ................
3つのアクションにしたがって,それぞれの色で描くようにします。
drawToBuff()メソッドの最初の部分です。引数としてchar変数をうけます。あまり美しくはありませんがこれはそのままrandomColor(rgb);としてrandomColor()を呼び出します。
public void drawToBuff(char rgb) { for(int i=0; 10>i; i++){ Color rcolor = randomColor(rgb); bfg.setColor(rcolor);
randomColor()メソッドの最初の部分です。これも引数としてchar変数をうけます。こちらの変数も同じ名前(rgb)ですが、randomColor()で宣言されているので別の変数として取り扱われます。
いままで緑成分を乱数で出していましたが、xに乱数をいったん入れて、rgbの値によってこれを赤緑青のどれかにしています。
public Color randomColor(char rgb){ int r=0; int g=0; int b=0; int dc=256; int x = (int)(dc*Math.random()); if (x > 255){ x = 0; } if (rgb=='r') r=x; if (rgb=='g') g=x; if (rgb=='b') b=x; Color c = new Color(r,g,b); return c; }
上記プログラムをつくって動作を確認しなさい。