import java.awt.*;   
import java.awt.event.*;   
import java.util.*;   
import java.awt.geom.*;   
import javax.swing.*;   
  
public class MouseTest{   
        public static void main(String args[]){   
                MouseFrame mf = new MouseFrame();   
                mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
                mf.setVisible(true);   
        }   
}   
  
class MouseFrame extends JFrame{   
        public MouseFrame(){   
              setTitle("MouseTest");   
              setLocation(300,300);   
              setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);   
                MousePanel mp = new MousePanel();   
                getContentPane().add(mp);   
        }   
        public static final int DEFAULT_WIDTH = 300;   
        public static final int DEFAULT_HEIGHT = 200;   
}   
  
class MousePanel extends JPanel{   
      private ArrayList<Rectangle2D> squares;   
      private Rectangle2D current;   
      private static final int SIDELENGTH = 10;   
        public MousePanel(){   
                squares = new ArrayList<Rectangle2D>();   
                current = null;   
                addMouseListener(new MouseHandler());   
        }   
        public void paintComponent(Graphics g){   
                super.paintComponent(g);   
                Graphics2D g2 =(Graphics2D)g;   
                for(Rectangle2D r : squares){   
                    g2.draw(r);   
                }   
        }   
        public Rectangle2D find(Point2D p){   
              for(Rectangle2D r : squares){   
                      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;     
                 //什么情况下s不等于current?   
              squares.remove(s);   
              repaint();   
        }   
        private class MouseHandler extends MouseAdapter{   
                public void mousePressed(MouseEvent e){   
                              //add a new square if the cursor isn't inside a square   
                        current = find(e.getPoint());   
                        if(current == null){   
                                add(e.getPoint());   
                        }   
                }   
              public void mouseClicked(MouseEvent e){   
                            //remove the current square if double clicked   
                      current = find(e.getPoint());   
                      if(current!=null&&e.getClickCount()>=2){   
                              remove(current);   
                      }   
              }                 
        }    
}  

解决方案 »

  1.   

    楼主的这个程序是用一个面板绘制小正方形,当鼠标按下时,若该点不在某个正方形之内,则添加一个正方形,当鼠标双击时,若落在某个正方形之内,则删除该正方形。解释一下remove()方法的逻辑,首先是s == null,表明没双击到正方形,直接返回,然后是s == current,很明显,current的值是在add()方法里面设置的,说明每次添加正方形的时候会设置,故current代表最后添加到面板上的正方形,但是之前有可能添加了很多正方形(放在了squares集合里面),只要不是点击的最后一个添加到面板上的正方形,s就不等于current
      

  2.   


    public void mouseClicked(MouseEvent e){   
                                //remove the current square if double clicked   
                          current = find(e.getPoint());   
                          if(current!=null&&e.getClickCount()>=2){   
                                  remove(current);   
                          }   
                  }         这个方法,不一定是最后的方块是current啊,应该是双击哪一个方块,哪一个方块就是current啊?
      

  3.   

    还真没看到,不好意思,那就是代码有问题,s恒等于current。楼主可以在MouseHandler类里面再加一个current变量,那mouseClicked()方法访问的就是这个变量,而remove方法访问的就是MousePanel类里面的current,代码逻辑就通顺了,虽然看起来头晕,最好还是别外搞个变量吧
      

  4.   

    谢谢你,这个是core java上的例子,看的PDF版的,也不知道和真实版有没有区别,我这个问题搞了一天了。
      

  5.   

    core java上面的代码也有问题的,我买了卷I、II两本,某一章讲打印的章节里面最后居然流都没有close,不过大部分代码还是没问题的,也是好书,你这个问题可以告诉我是第几章第几节的,我可以帮你查一下,我的是core java第七版。
      

  6.   

    第8章的,8.4.2鼠标事件的例子程序,看的也是第7版的PDF
      

  7.   

    感觉在Core Java2 里面 呃  第七章到九章之间的一个范例吧~~呃 正在看这部分~~ 嗯 可以查阅下书~
      

  8.   

    在这个代码中一定是是恒等的。要说什么时候会不等,因为remove是一个public方法,或许当另一个人用不严谨的方法调用它的的时候就有可能不相等了。
      

  9.   

    s不等于current的情况是会发生的, 当机器很慢并且快速来回双击不同square的时候o(╯□╰)o, 因为每次单击或者双击都会重置current, 当重置发生在头一次双击‘if(s == current)current = null’ 这一行之前时 current已经被修改了 当执行到该判断时 就不相等了。
    o(╯□╰)o