[code="java"]
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 squares;
private Rectangle2D current;
private static final int SIDELENGTH = 10;
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(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){
//
// }
// }
}
[/code]
这是书上一个例子的部分程序,请问注释处的if啥意思?不就是把curent传给s嘛?s和此时的current本来就是相等的啊,为什么还要判断?
跟多线程无关。。。看来你还是没懂俺的意思。。。
如果我传入一个参数,要删除,但是这个参数不是当前的,那么当前的是否为空?显然不是,就这么简单
if(s == current)current = null;
主要是为了确保此刻如果s和current相等的话,current 为null.然后再从List集合里面把s删除,这个代码写的比较规范,防止意外发生.
if(s == current) 比较两个对象引用是否相等 相当于s和current所指向的地址 避免把current的引用删除。current在后面可能还要使用。
直接改成current = null的话,这样就不严密了.条件是s要和current的对象引用相等.
说实话,这个要解释还真难。
不在语句的语法方面,而在整个程序的逻辑,看了大半天,有几个类还不认识,对Swing没太多关注。
不过从整体上看,这个方法public void remove(Rectangle2D s);
提供的是删除功能,而从实现上看,是删除MousePanel 的一个实例容器中的对象,
ArrayList 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
[quote]
什么情况下不等呢?我给他传个参数,要么为空,要么肯定相等的啊?
[/quote]
s指向对象1 current指向对象2 时 s!=current
current的作用是干什么的?
current不断变化,添加新元素 当你调用remove(Rectangle2D s)时 如果s和current指向同一个对象 删除s的同时也删除了current 所以 if(s == current)current = null; 这句就是为了不删除引用current 因为后面你可能还要用current添加新元素。