鼠标事件实例

来源:互联网 发布:gnuradio windows 编辑:程序博客网 时间:2024/04/29 19:46

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;

public class MouseTest
{
 public static void main(String[] args)
 {
  MouseFrame frame = new MouseFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.show();
 }
}

class MouseFrame extends JFrame
{
 public MouseFrame()
 {
  setTitle("MouseTest");
  setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
  
  MousePanel panel = new MousePanel();
  Container contentPane = getContentPane();
  contentPane.add(panel);
 }
 
 public static final int DEFAULT_WIDTH = 300;
 public static final int DEFAULT_HEIGHT = 200;
}

class MousePanel extends JPanel
{
 public MousePanel()
 {
  squares = new ArrayList();
  current = null;
  
  addMouseListener(new MouseHandler());
  addMouseMotionListener(new MouseMotionHandler());
 }
 
 public void paintComponent(Graphics g)
 {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D)g;
  
  for(int i=0;i<squares.size();i++)
    g2.draw((Rectangle2D)squares.get(i));
 }
 
 public Rectangle2D find(Point2D p)
 {
  for(int i=0;i<squares.size();i++)
  {
   Rectangle2D r = (Rectangle2D)squares.get(i);
   if(r.contains(p)) return r;
  }
  
  return null;
 }
 
 public void add(Point2D p)
 {
  double x=p.getX();
  double y=p.getY();
  
  current = new Rectangle2D.Double(
   x - SIDELENGTH/2,
   y - SIDELENGTH/2,
   SIDELENGTH,
   SIDELENGTH);
  squares.add(current);
  repaint();
  
 }
 
 public void remove(Rectangle2D s)
 {
  if(s == null) return;
  if(s == current) current = null;
  squares.remove(s);
  repaint();
 }
 
 private static final int SIDELENGTH = 10;
 private ArrayList squares;
 private Rectangle2D current;
 
 private class MouseHandler extends MouseAdapter
 {
  public void mousePressed(MouseEvent event)
  {
   current = find(event.getPoint());
   if(current == null)
     add(event.getPoint());
  }
  
  public void mouseClicked(MouseEvent event)
  {
   current = find(event.getPoint());
   if(current != null&& event.getClickCount()>=2)
      remove(current);
  }
 }
 
 private class MouseMotionHandler
    implements MouseMotionListener
    {
     public void mouseMoved(MouseEvent event)
     {
      if(find(event.getPoint()) == null)
         setCursor(Cursor.getDefaultCursor());
      else
         setCursor(Cursor.getPredefinedCursor
            (Cursor.CROSSHAIR_CURSOR));
     }
     
     public void mouseDragged(MouseEvent event)
     {
      if(current != null)
      {
       int x = event.getX();
       int y = event.getY();
       
       current.setFrame(
        x - SIDELENGTH/2,
           y - SIDELENGTH/2,
           SIDELENGTH,
           SIDELENGTH);
       repaint();
      }
     }
     
    }
 
}