Mouse の操作で矩形を描画

マウスのリスナーをサブクラス化して、ドラッグで矩形を描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして MouseBox.java の名前で保存して下さい。
    //★ マウスのドラッグで矩形を描く    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    class MouseBox extends JFrame
    {   int x1, y1, x2, y2;
        int w, h;
        Dimension   size;
    
        // Main
        public static void main(String args[])
        {   new MouseBox();
        }
    
        // Constructor
        MouseBox()
        {   super("MouseBox");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            addMouseListener(new inMouseListener());
            addMouseMotionListener(new inMouseMotionListener());
            setSize(300, 300);
            setVisible(true);
            size = getSize();
        }
    
        // Paint
        public void paint(Graphics g)
        {
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            g.setColor(Color.black);
            g.drawRect(x1, y1, w, h);
        }
    
        //InnerClass MouseListener
        class inMouseListener extends MouseAdapter
        {   public void mousePressed(MouseEvent e)
            {   x1 = e.getX();
                y1 = e.getY();
            }
        }
    
        //InnnerClass MouseMotionListener
        class inMouseMotionListener extends MouseMotionAdapter
        {   public void mouseDragged(MouseEvent e)
            {   x2 = e.getX();
                y2 = e.getY();
                w = x2 - x1;
                h = y2 - y1;
                repaint();
            }
        }
    }
    
  2. java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    マウス操作で矩形を描きます。
    画面左上の適当な位置でマウスボタンを押して、そのまま右下方向へドラッグして下さい。
    押した座標とボタンを離した座標を頂点とする矩形が描画されたら完成です。

プログラムの説明

  1. マウスの操作には Listener を使うので java.awt.event.* をインポートして下さい。
    x1, y1, x2, y2 はマウスで指示された座標を記憶する領域です。
    w, h は矩形の幅と高さです。
    size はウインドウのサイズを記憶する領域です。
        import java.awt.*;
        import javax.swing.*;
        import java.awt.event.*;
        class MouseBox extends JFrame
        {   int x1, y1, x2, y2;
            int w, h;
            Dimension   size;
        
  2. MouseBox の Constructor です。
    addMouseListener() でマウスが押された Event をキャッチします。
    addMouseMotionListener() でマウスがドラッグされた Event をキャッチします。
    今回は MouseListener と MouseMotionListener をサブクラス化しています。
        // Constructor
        MouseBox()
        {   super("MouseBox");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            addMouseListener(new inMouseListener());
            addMouseMotionListener(new inMouseMotionListener());
            setSize(300, 300);
            setVisible(true);
            size = getSize();
        }
        
  3. マウスが押された Event をキャッチするメソッドです。
    マウスが押された座標を x1,y1 にセーブします。
        class inMouseListener extends MouseAdapter
        {   public void mousePressed(MouseEvent e)
            {   x1 = e.getX();
                y1 = e.getY();
            }
        }
        
  4. マウスがドラッグされた Event をキャッチするメソッドです。
    w,h に幅と高さを求めて repaint() で paintComponent() メソッドに制御を渡します。
        class inMouseMotionListener extends MouseMotionAdapter
        {   public void mouseDragged(MouseEvent e)
            {   x2 = e.getX();
                y2 = e.getY();
                w = x2 - x1;
                h = y2 - y1;
                repaint();
            }
        }
        
  5. paint() は描画処理で呼び出されるメソッドです。
    g.setColor() で色を設定して g.fillRect() で画面を塗りつぶします。
    super.paint(g) を呼び出すと画面がクリアされるのですが、「ちらつき」が大きくなります。
    その上から Color.black を設定して g.drawRect(x1,y1,w,h) で矩形を描きます。
    x1,y1 は左上の座標で w,h は幅と高さです。
        public void paint(Graphics g)
        {   //super.paint(g);
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            g.setColor(Color.black);
            g.drawRect(x1, y1, w, h);
        }
        

超初心者のプログラム入門(Java2)