import java.awt.*; import java.awt.event.*; // event用 import javax.swing.*; public class Ex9_2 extends JPanel { Person p1 = new Person(Color.ORANGE, 100, 100, 20); // 人クラス:1人目インスタンス生成 Person p2 = new Person(Color.BLUE, 150, 50, 30); // 人クラス:2人目インスタンス生成 Person p3 = new Person(Color.GREEN, 200, 200, 40); // 人クラス:3人目インスタンス生成 Person p4 = new Person(Color.RED, 300, 70, 50); // 人クラス:4人目インスタンス生成 public Ex9_2() { // コンストラクタ setOpaque(false); // 前の画面の残像は消して次を描くように設定 addMouseMotionListener(new MouseMotionAdapter() { // MouseMotionListener: 動きMotionを伴うMouseイベントのインタフェース public void mouseDragged(MouseEvent e) { // ドラッグされたら実行 requestFocus(); // 【重要】窓にキーイベントを送るために必要 if (e.isShiftDown()) { // [Shift]キー+[Drag]したら… p1.moveTo(e.getX(), e.getY()); // p1を動かす } else if (e.isControlDown()) { // [Ctrl]キー+[Drag]したら… p2.moveTo(e.getX(), e.getY()); // p2を動かす } else if (e.isAltDown()) { // [Alt]キー+[Drag]したら… p3.moveTo(e.getX(), e.getY()); // p3を動かす } else { // [Drag]したら… p4.moveTo(e.getX(), e.getY()); // p4を動かす } repaint(); // 窓に対して画面を再描画 } }); // End of addMouseMotionListener() addKeyListener(new KeyAdapter() { // KeyListener: キーボードeventのインタフェース public void keyPressed(KeyEvent e) { // キーが押されたら実行(注:マウスを一度クリックしないと実行しない) if (e.getKeyChar() == 'b') { p4.resize(5); } // サイズ+5 if (e.getKeyChar() == 's') { p4.resize(-5); } // サイズ-5 repaint(); // 窓に対して画面を再描画 } }); // End of addKeyListener() } public void paintComponent(Graphics g) { p1.draw(g); // 人p1 描画 p2.draw(g); // 人p2 描画 p3.draw(g); // 人p3 描画 p4.draw(g); // 人p4 描画 } public static void main(String[] args) { JFrame app = new JFrame(); app.add(new Ex9_2()); app.setSize(600, 500); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.setVisible(true); } static class Person { // 人クラス Color col; int[] xp = new int[24]; // 人の体をつくる x座標用配列 int[] yp = new int[24]; // 人の体をつくる y座標用配列 int x, y, wid; public Person(Color C1, int X, int Y, int W) { // コンストラクタ col = C1; x = X; y = Y; wid = W; init(x, y, wid); // 初期化(体を構成する位値座標ベクトル xp, yp を設定) } private void init(int X, int Y, int W) { // 初期化:Personクラス内からのみ呼出のため private指定 xp[0] = xp[1] = x; xp[4] = xp[5] = xp[22] = xp[23] = (x+wid); xp[2] = xp[3] = xp[6] = xp[7] = xp[20] = xp[21] = (x+2*wid); xp[8] = xp[9] = xp[12] = xp[13] = xp[18] = xp[19] = (x+3*wid); xp[10] = xp[11] = xp[14] = xp[15] = (x+4*wid); xp[16] = xp[17] = (x+5*wid); yp[0] = yp[19] = yp[20] = yp[23] = y; yp[17] = yp[18] = yp[21] = yp[22] = (y+wid); yp[1] = yp[2] = yp[13] = yp[14] = (y+2*wid); yp[3] = yp[4] = yp[11] = yp[12] = yp[15] = yp[16] = (y+3*wid); yp[7] = yp[8] = (y+4*wid); yp[5] = yp[6] = yp[9] = yp[10] = (y+5*wid); } public void moveTo(int dx, int dy) { // (dx,dy)の位値へ移動 x = dx; y = dy; init(x, y, wid); // 動いた先の位値で体構成座標再設定 } public void resize(int ss) { // 大きさ変更 ss=変化値(+:bigger, -:smaller) if (wid + ss > 0) { // サイズが0未満になっては困るのでその対処 wid += ss; } init(x, y, wid); // サイズ変更後の位値で体構成座標再設定 } public void draw(Graphics g) { // 描画メソッド g.setColor(col); // 体の色設定 g.fillPolygon(xp, yp, 24); // 体描画 g.setColor(Color.WHITE); // 目の色設定 g.fillOval(x+(int)(2.1*wid), y+(int)(0.1*wid), wid/2, wid/2); // 目 } } }