1安徽大学计算机实验教学中心学号专业计算机科学与技术姓名实验日期2017/10/29教师签字成绩实验报告【实验名称】第七章图形用户界面设计——聊天软件【实验目的】1.学习java图形用户界面设计2.学习java事件处理【实验原理】1.Java程序设计基本原理2.面向对象程序设计基本原理【实验内容】实验内容:根据已给出的聊天软件的基础例子程序,设计一个完整的聊天软件。实验要求:1、两个人互相合作完成聊天软件的设计;2安徽大学计算机实验教学中心在右图的基础上,添加2个文本框,用于输入对方的IP地址和端口号;在聊天记录显示区,给聊天双方添加姓名;3添加键盘事件处理,按下键盘的ENTER键,实现信息发送功能提示:可以增加发送文本框组件的键盘响应事件处理,在键盘事件处理方法中,发送数据。方法如下:1、实现键盘响应接口classMyExtendsJFrameextendsJFrameimplementsActionListener,Runnable,KeyListener{2、重写键盘响应的三个事件keyPressedkeyReleasedkeyTyped例如:publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_ENTER){发送数据}//判断是否是enter健,如果是则发送}3、添加文本框组件和键盘响应事件的关联按键响应举例buttonSend.addActionListener(newActionListener()//插入文字的事件{publicvoidactionPerformed(ActionEvente){bytedata[]=textSend.getText().getBytes();//获取发送文本框字符3安徽大学计算机实验教学中心Stringaddnum=IP.getText();try{InetAddressaddress=InetAddress.getByName(addnum);//设置目的IP地址DatagramPacketSendPacket=newDatagramPacket(data,data.length,address,2013);DatagramSocketPost=newDatagramSocket();//创建UDP发送对象Post.send(SendPacket);//发送数据Strings9=newString(SendPacket.getData(),0,SendPacket.getLength());//读取数据包SimpleDateFormatdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss);//设置日期格式insert(s9,mystyle());}catch(Exceptione1){}textSend.setText();}});重写键盘响应publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_ENTER){bytedata[]=textSend.getText().getBytes();//获取发送文本框字符Stringaddnum=IP.getText();try{InetAddressaddress=InetAddress.getByName(addnum);//设置目的IP地址//InetAddressaddress=InetAddress.getByName(127.0.0.1);//设置目的IP地址DatagramPacketSendPacket=newDatagramPacket(data,data.length,address,2013);//基于上一步的目标地址,创建UDP数据包,目标端口为2013DatagramSocketPost=newDatagramSocket();//创建UDP发送对象Post.send(SendPacket);//发送数据Strings9=newString(SendPacket.getData(),0,SendPacket.getLength());//读取数据包SimpleDateFormatdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss);//设置日期格式insert(s9,mystyle());}4安徽大学计算机实验教学中心catch(Exceptione1){}textSend.setText();}}publicvoidkeyTyped(KeyEvente){//TODOAuto-generatedmethodstub}附加功能:设置字体及分栏publicSimpleAttributeSetmystyle()//自己发出的字体颜色格式,在右边{SimpleAttributeSetmySet=newSimpleAttributeSet();StyleConstants.setForeground(mySet,Color.red);StyleConstants.setAlignment(mySet,StyleConstants.ALIGN_RIGHT);StyleConstants.setUnderline(mySet,true);StyleConstants.setFontFamily(mySet,lucidatypewriterbold);StyleConstants.setFontSize(mySet,24);returnmySet;}publicSimpleAttributeSethisstyle()//对方发出的字体颜色格式,在右边{SimpleAttributeSethisSet=newSimpleAttributeSet();StyleConstants.setForeground(hisSet,Color.blue);StyleConstants.setAlignment(hisSet,StyleConstants.ALIGN_LEFT);StyleConstants.setUnderline(hisSet,true);StyleConstants.setFontFamily(hisSet,lucidabrightitalic);StyleConstants.setFontSize(hisSet,24);returnhisSet;}插入文本到区域privatevoidinsert(Stringstr,SimpleAttributeSetset)//添加自己的名字{try//插入文本{SimpleDateFormatdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss);//设置日期格式str=\n+df.format(newDate())+'\n'+s3+:+str+'\n';5安徽大学计算机实验教学中心doc.insertString(doc.getLength(),str+\n,set);doc.setParagraphAttributes(doc.getLength()-str.length(),str.length(),set,false);}catch(BadLocationExceptione){e.printStackTrace();}}插入图片到区域b_icon=newJButton(图片);//插入图片b_icon.addActionListener(newActionListener()//插入图片事件{publicvoidactionPerformed(ActionEventarg0){JFileChooserf=newJFileChooser();//查找文件f.showOpenDialog(null);insertIcon(f.getSelectedFile());//插入图片}});privatevoidinsertIcon(Filefile)//找寻文件位置{text.setCaretPosition(doc.getLength());//设置插入位置text.insertIcon(newImageIcon(file.getPath()));//插入图片//insert(newFontAttrib());//这样做可以换行}清空文本区域:并设立监听b_remove=newJButton(清空);//清除b_remove.addActionListener(newActionListener()//清除事件{publicvoidactionPerformed(ActionEvente){text.setText();}});实现演示:6安徽大学计算机实验教学中心插入图片:7安徽大学计算机实验教学中心【小结或讨论】8安徽大学计算机实验教学中心1、本程序不可在手机无线网的状态下进行运行,可能原因是系统对其拦截,在有网线的公网的情况下,测试成功。2、由于前期使用的win10笔记本防火墙权限较高,导致发送不出去,经不断寻求解决方案,得以解决。在实现图片插入时,仅仅实现插入插入到显示区域,并不能实际发送出去。本次实现极大的促进了自身上网搜寻资料的能力。4、在聊天的时候,请点击确认按钮,切记5、代码见附录packageqqchat;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;9安徽大学计算机实验教学中心importjava.awt.event.KeyListener;importjava.io.File;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.BorderFactory;importjavax.swing.Box;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JFileChooser;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JScrollBar;importjavax.swing.JScrollPane;importjavax.swing.JTextField;10安徽大学计算机实验教学中心importjavax.swing.JTextPane;importjavax.swing.text.BadLocationException;importjavax.swing.text.DefaultCaret;importjavax.swing.text.SimpleAttributeSet;importjavax.swing.text.StyleConstants;importjavax.swing.text.StyledDocument;classMyExtendsJFrameextendsJFrameimplementsActionListener,Runnable,KeyListener{//自定义窗口类,//1.继承窗口类,用于设计窗体;//2.实现ActionListener,用于响应按钮点击事件//3.实现Runnable,重写run方法,用于执行接收线程Strings1,s2,s3,s4,s6;//自己的名字JLabelname