11.3 鼠标事件

来源:互联网 发布:15年网络流行关键词 编辑:程序博客网 时间:2024/06/05 19:06
import java.awt.*;import javax.swing.*;/** * @version 1.34 2015-06-12 * @author Cay Horstmann */public class MouseTest{   public static void main(String[] args)   {      EventQueue.invokeLater(() -> {         JFrame frame = new MouseFrame();         frame.setTitle("MouseTest");         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);      });   }}
import javax.swing.*;/** * A frame containing a panel for testing mouse operations */public class MouseFrame extends JFrame{   public MouseFrame()   {      add(new MouseComponent());      pack();   }}
import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.util.*;import javax.swing.*;/** * A component with mouse operations for adding and removing squares. */public class MouseComponent extends JComponent{   private static final int DEFAULT_WIDTH = 300;   private static final int DEFAULT_HEIGHT = 200;   private static final int SIDELENGTH = 10;   private ArrayList<Rectangle2D> squares;   private Rectangle2D current; // the square containing the mouse cursor   public MouseComponent()   {      squares = new ArrayList<>();      current = null;      addMouseListener(new MouseHandler());      addMouseMotionListener(new MouseMotionHandler());   }   public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }      public void paintComponent(Graphics g)   {      Graphics2D g2 = (Graphics2D) g;      // draw all squares      for (Rectangle2D r : squares)         g2.draw(r);   }   /**    * Finds the first square containing a point.    * @param p a point    * @return the first square that contains p    */   public Rectangle2D find(Point2D p)   {      for (Rectangle2D r : squares)      {         if (r.contains(p)) return r;      }      return null;   }   /**    * Adds a square to the collection.    * @param p the center of the square    */   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();   }   /**    * Removes a square from the collection.    * @param s the square to remove    */   public void remove(Rectangle2D s)   {      if (s == null) return;      if (s == current) current = null;      squares.remove(s);      repaint();   }   private class MouseHandler extends MouseAdapter   {      public void mousePressed(MouseEvent event)      {         // add a new square if the cursor isn't inside a square         current = find(event.getPoint());         if (current == null) add(event.getPoint());      }      public void mouseClicked(MouseEvent event)      {         // remove the current square if double clicked         current = find(event.getPoint());         if (current != null && event.getClickCount() >= 2) remove(current);      }   }   private class MouseMotionHandler implements MouseMotionListener   {      public void mouseMoved(MouseEvent event)      {         // set the mouse cursor to cross hairs if it is inside         // a rectangle         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();            // drag the current rectangle to center it at (x, y)            current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);            repaint();         }      }   }   }
0 0
原创粉丝点击