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

来源:互联网 发布:高安seo 编辑:程序博客网 时间:2024/06/11 19:48


今天在华信继续完成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  发送鼠标事件

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

2 0
原创粉丝点击