HuaXinIM聊项目阶段总结二(从别人身上总结经验吸取教训)


今天在华信继续完成HuaXinIM聊项目,有一个人没来,有一个只来了一会儿,其中一人项目完成得差不多了,另一个人忙完了他的事,也开始项目的编程了,但是因为他们今晚不在华信上课,所以我们没有太多的交流,对于他们的项目也不太了解,其中一个组员对框架提出了意见,经过思索,发现还是可取的。


今晚的课程时间是小组各完成各自项目,其中一个组员的对于他所负责的项目内容不太了解,思路也不太清晰,所以我今晚几乎都在他的身边帮助他理清思路。

平时他要忙的事似乎比较多,所以有可能课程不太跟得上,一些Java的基础知识也不太牢固,对于Java的基本思想封装性也了解得不够深入,这是我在帮助他,让他理清思路编写远程控制模块的时候发现的问题。


在跟他讲解的时候,我也发现了团队项目的完成不能够有太多的限定,我本以为在那个类里面只要两个方法就可以了,但是这也是我的想法。


但是我在帮助他理清思路的时候,发现他老是问我:“是不是这样”、“这样可不可以”、“这样对不对”。

刚开始我一直回答他的问题,到了后来我发现了不太对劲,似乎心里有一个疑问:怎么好像是他遇到问题,然后抛给了我,我得出了答案,然后告诉他一样?事实上也确实如此,我代替了他的思考,剥夺了他的主动性,这样确实可以让项目更快的完成,但是他从中学习到的知识与积累下的经验也就聊聊无几了。


后来我就改变了帮助的方法,我不回答他的问题,反而问他问题,然后让他自己解答;他遇到了不确定的地方,怕犯错误,然后问我正确与否,我也不回答,让他自己去尝试,这也是我亲身的经验:犯过错误才能够印象深刻。


这样之后,虽然后来时间长了很多,但是我确实帮助了他,让他从中学习到了很多知识经验,最后终于把远程控制的代码编写完成。


在代码的封装性与整洁度上看,他的代码确实惨不忍睹...下面发上来,让诸君看一看:

	// 控制方法Control() 被控制方法byControled()
	// 获取io流
	public ObjectInputStream ois;
	public ObjectOutputStream oos;

	public DistanceControl(ObjectInputStream ois, ObjectOutputStream oos) {
		this.ois = ois;
		this.oos = oos;
	}

	// 定义一个机器人类对象,用于操控
	private Robot robot;

	{
		try {
			robot = new Robot();
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}

	public JLabel imageLabel;

	/**
	 * 初始化窗体
	 */
	public void Control() {
		imageLabel = new JLabel();
		this.add(imageLabel);
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		this.setSize(dim);
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		new Thread() {
			public void run() {
				while (true) {
					// 显示屏幕
					receivePicture();
				}
			}
		}.start();
		this.setVisible(true);
		this.addMouseListener(ma);
		this.addMouseMotionListener(ma);
		this.addMouseWheelListener(ma);
		this.addKeyListener(ka);

	}

	/**
	 * 鼠标监听
	 */
	MouseAdapter ma = new MouseAdapter() {
		public void mousePressed(MouseEvent e) {
			sendEvent(e);
		}

		public void mouseReleased(MouseEvent e) {
			sendEvent(e);
		}

		public void mouseClicked(MouseEvent e) {
			sendEvent(e);
		}

		public void mouseMoved(MouseEvent e) {
			sendEvent(e);
		}

		public void mouseDragged(MouseEvent e) {
			sendEvent(e);
		}
	};
	/**
	 * 键盘监听
	 */
	KeyAdapter ka = new KeyAdapter() {
		public void keyPressed(KeyEvent e) {
			sendEvent(e);
		}

		public void keyReleased(KeyEvent e) {
			sendEvent(e);
		}
	};

	/**
	 * 发送事件
	 */
	private void sendEvent(InputEvent e) {
		try {
			oos.writeObject(e);
			oos.flush();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	/**
	 * 接收截图
	 */
	public void receivePicture() {
		try {
			// 获取长度
			int imageLength = ois.readInt();
			// 创建图片字节数组
			byte[] data = new byte[imageLength];
			// 读取一张图片的字节数组
			ois.readFully(data);
			// 将读入字节转化为一个BufferedImage对象
			ByteArrayInputStream bais = new ByteArrayInputStream(data);
			BufferedImage image = ImageIO.read(bais);
			ImageIcon icon = new ImageIcon(image);
			imageLabel.setIcon(icon);
			imageLabel.repaint();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 被控制方法
	 */
	public void byControled() {
		try {
			// 发送图片
			new Thread() {
				public void run() {
					while (true) {
						try {
							createImage();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}.start();
			new Thread() {
				public void run() {
					while (true) {
						// 读取操作
						readOperate();
					}
				}
			}.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 读操作对象
	 */
	public void readOperate() {
		try {
			// 读对象
			Object ie = ois.readObject();
			// 判断转换前的类型
			if (ie instanceof MouseEvent) {
				// 转换为鼠标事件
				MouseEvent me = (MouseEvent) ie;
				// 判断当前鼠标事件是由什么触发的
				int id = me.getID();
				if (id == MouseEvent.MOUSE_PRESSED) {// 按下
					int number = me.getButton();
					if (number == MouseEvent.BUTTON1) {
						robot.mousePress(InputEvent.BUTTON1_MASK);
					} else if (number == MouseEvent.BUTTON2) {
						robot.mousePress(InputEvent.BUTTON2_MASK);
					} else if (number == MouseEvent.BUTTON3) {
						robot.mousePress(InputEvent.BUTTON3_MASK);
					}
				} else if (id == MouseEvent.MOUSE_CLICKED || id == MouseEvent.MOUSE_RELEASED) {// 移动
					int number = me.getButton();
					if (number == MouseEvent.BUTTON1) {
						robot.mousePress(InputEvent.BUTTON1_MASK);
					} else if (number == MouseEvent.BUTTON2) {
						robot.mousePress(InputEvent.BUTTON2_MASK);
					} else if (number == MouseEvent.BUTTON3) {
						robot.mousePress(InputEvent.BUTTON3_MASK);
					}
				} else if (id == MouseEvent.MOUSE_DRAGGED || id == MouseEvent.MOUSE_MOVED) {// 点击
					robot.mouseMove(me.getX(), me.getY());
				}
			} else if (ie instanceof KeyEvent) {
				// 转换为键盘事件
				KeyEvent me = (KeyEvent) ie;
				int id = me.getID();
				System.out.println(id);
				if (id == KeyEvent.KEY_PRESSED) {
					robot.keyPress(me.getKeyCode());
				} else if (id == KeyEvent.KEY_RELEASED) {
					robot.keyRelease(me.getKeyCode());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取屏幕截图并发送
	 * 
	 * @throws IOException
	 */
	public void createImage() throws Exception {
		Toolkit tk = Toolkit.getDefaultToolkit();
		// 获取屏幕大小
		Dimension dm = tk.getScreenSize();
		// 设定区域的大小
		Rectangle rt = new Rectangle(0, 0, dm.width, dm.height);
		// 取得指定大小的一张图片
		BufferedImage image = robot.createScreenCapture(rt);
		// 创建一段内存流
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		// 将图片数据写入内存流
		ImageIO.write(image, "jpeg", baos);
		// 创建字节数组
		byte[] data = baos.toByteArray();
		// 发送图片数据长度
		oos.writeInt(data.length);
		// 写入图片字节数据
		oos.write(data);
		oos.flush();
		Thread.sleep(20);
	}

在编写代码的时候,发现他一个不太可取的地方就是:他是在测试项目中写实现的代码,然后直接复制粘贴到了项目框架上去了,而不想想每一行代码的逻辑结构与模块的组成,代码之间的耦合度与如何解耦。

要是我写的话,我会在框架上重新创建一个方法:里面先写上

//TODO  创建窗体,添加监听器

//TODO  实时接收截图

//TODO  发送鼠标事件

然后就是代码的一个个填充,而不会省事的把测试项目中的代码直接照搬到框架上,再慢慢修改,说实话:看到他复制粘贴那一幕我真是惊呆了...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值