问题描述
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());// addMouseMotionListener(new MouseMotionHandler()); } 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; //这个if判断什么意思,起到什么作用? 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); } } }// private class MouseMotionHandler implements MouseMotionListener{// public void mouseMoved(MouseEvent e){// // }// public void mouseDragged(MouseEvent e){// // }// }}这是书上一个例子的部分程序,请问注释处的if啥意思?不就是把curent传给s嘛?s和此时的current本来就是相等的啊,为什么还要判断? 问题补充:cuiran 写道
解决方案
跟多线程无关。。。看来你还是没懂俺的意思。。。如果我传入一个参数,要删除,但是这个参数不是当前的,那么当前的是否为空?显然不是,就这么简单
解决方案二:
current不断变化,添加新元素 当你调用remove(Rectangle2D s)时 如果s和current指向同一个对象 删除s的同时也删除了current 所以 if(s == current)current = null; 这句就是为了不删除引用current 因为后面你可能还要用current添加新元素。
解决方案三:
current的作用是干什么的?
解决方案四:
引用什么情况下不等呢?我给他传个参数,要么为空,要么肯定相等的啊?s指向对象1 current指向对象2 时 s!=current
解决方案五:
说实话,这个要解释还真难。不在语句的语法方面,而在整个程序的逻辑,看了大半天,有几个类还不认识,对Swing没太多关注。不过从整体上看,这个方法public void remove(Rectangle2D s);提供的是删除功能,而从实现上看,是删除MousePanel 的一个实例容器中的对象,ArrayList<Rectangle2D> squares 这就是那个容器了,里面装Rectangle2D对象。整个方法的意思就是从squares 容器中删除传入的Rectangle2D s而之所以进行if(s==current)判断,是因为current是MousePanel 对象当前的Rectangle2D对象,换句话说,在这个程序中,新增(调用public void add(Point2D p)方法)current会被实例化而整个删除方法是public的,外部完全可以调用此方法,如果不做条件判断,我删除一个Rectangle2D对象,这个对象不是当前正在用的,程序却把当前正在用的Rectangle2D引用赋值为null,显然这就是bug了。。这上面的话全是废话,lz看了可能会晕所以举个列子简单点说current 当前正在用的的一个东东(一张图片)squares 装东东(图片)的一个容器s 一个东东(图片)现在我和我朋友正在浏览图片(一本影集),我们看到的是同一张图片(此时这张图片是current),当我想删除我看到的图片时,操作应该就是把current传给删除方法,删除方法从squares中删除current,current这个引用指向null,但是如果删除操作不是我来启动的,而是我朋友启动的,他传入另一张图片,要求删除,那么是不是我们当前看到的这张图片current被指向null呢?显然不是我朋友删除图片时如果他删除的不是我们当前正在看的,那么我们当前看的那张图片就不应该指向空,我们应该能看到那张图片。而当我朋友删除的是我们当前看的那张图片时,那么我们当前看的这张图片应该不存在,指向null
解决方案六:
直接改成current = null的话,这样就不严密了.条件是s要和current的对象引用相等.
解决方案七:
if(s == current) 比较两个对象引用是否相等 相当于s和current所指向的地址 避免把current的引用删除。current在后面可能还要使用。
解决方案八:
if(s == current)current = null; 主要是为了确保此刻如果s和current相等的话,current 为null.然后再从List集合里面把s删除,这个代码写的比较规范,防止意外发生.