书上的例子,麻烦解释下

问题描述

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删除,这个代码写的比较规范,防止意外发生.

时间: 2024-10-26 14:58:42

书上的例子,麻烦解释下的相关文章

新手怎么思考c语言书上的例子

问题描述 新手怎么思考c语言书上的例子 c语言新手一枚,自学中,现在很不熟练. 面对书上稍微复杂一点的例子, 脑子里就一团浆糊.所以昨天开始就试着在敲例子前画程序流程图.然后再敲,请问这种方法是对的吗?如果不是或者有什么要补充的麻烦给我讲一下,谢谢啦! 解决方案 最好找一个懂程序的人教你下.看下人家是怎么写程序的. 我见过一些初学者遇到的困难,是因为他们完全是根据书本上写好的程序在模仿.但是这有一个问题,就是看不到程序从无到有的过程. 好比根据烧好的菜去研究烹饪或者根据画好的画去学习素描,这都是

java小白求解,下面的代码是按照书上的例子抄下来的,不明白为什么报错。

问题描述 java小白求解,下面的代码是按照书上的例子抄下来的,不明白为什么报错. 代码如下:主要问题就是报错的地方:已经用注释吧报错贴上:还看不懂这个报错,求大神帮助:package Calendar; import java.util.Scanner; public class Calendar { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println(

new-Kmeans算法初学者,想请教大神,编程不怎么强麻烦解释下谢谢

问题描述 Kmeans算法初学者,想请教大神,编程不怎么强麻烦解释下谢谢 List<ArrayList<Double>> centers = new ArrayList<ArrayList<Double>>(); List<ArrayList<Double>> newCenters = new ArrayList<ArrayList<Double>>(); List<ArrayList<ArrayL

c# 发送邮件报错见下图,有知道的麻烦解释下

问题描述 新手没分,请谅解[img=http://b224.photo.store.qq.com/psb?/V13OtwCc3QBOvp/6AkGlPdiiRphO5GNbZgaHtn4VjSrVxa1VH4XdSJlqhk!/b/YaTEhoUWGgAAYvbWiYW1HgAA][/img] 解决方案 解决方案二:自己发帖后不好好看看,没图没真像把图片上传到csdn空间相册,在把地址复制进来解决方案三:引用1楼的回复: 自己发帖后不好好看看,没图没真像把图片上传到csdn空间相册,在把地址复制

按书上的例子,写了个长的go代码

用于实现快速排序和冒泡排序的东东. 包括了蛮多东西的实现,输入输出,字符串处理等.... bubblesort.go package bubblesort func BubbleSort(values []int) { flag := true for i := 0; i < len(values)-1; i++ { flag = true for j := 0; j < len(values)-i-1; j++ { if values[j] > values[j+1] { values

opengl-麻烦解释下代码的含义

问题描述 麻烦解释下代码的含义 #include GLfloat xRotated, yRotated, zRotated; void Display(void) { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0,0.0,-4.0); glRotatef(xRotated,1.0,0.0,0.0); glRotatef(yRotated,0.0,1.0,0.0); glRotatef(zRotated,0.0,0

Eclipse控制台输出编号:1姓名:王丹性别:女部门:质量部怎么弄啊!书上的例我感觉能看懂啊 为什么一到自己打就无从下手了呢,感觉什么都不会了呢?

问题描述 Eclipse控制台输出编号:1姓名:王丹性别:女部门:质量部怎么弄啊!书上的例我感觉能看懂啊为什么一到自己打就无从下手了呢,感觉什么都不会了呢? 解决方案 解决方案二:publicclassName{publicstaticvoidmain(String[]args){System.out.println("编号:1");System.out.println("姓名:王丹");System.out.println("性别:女");Sy

db2-DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下。

问题描述 DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下. DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下.

url-下面的例子是为什么,谁能解释下

问题描述 下面的例子是为什么,谁能解释下 一个简单的 GET 请求:xmlhttp.open(""GET""demo_get.asp""true);xmlhttp.send(); 在上面的例子中,您可能得到的是缓存的结果.为了避免这种情况,请向 URL 添加一个唯一的 ID:xmlhttp.open(""GET""demo_get.asp?t="" + Math.random()true