⽤JavaSwing实现QQ聊天界⾯
⽤Java Swing实现QQ聊天界⾯
先附上团队博客链接
个⼈博客
⽂章内容概要
1.代码过程中遇到的问题以及如何解决
2.团队项⽬中负责的功能展⽰
3.尚未完成的功能,今后的改进和总结
4.gitee的提交记录
1. 编写Gui过程中遇到的问题
对JavaSwing布局管理器的总结
1.在控件有布局管理器的情况下,控件是⽆法通过setSize来控制⼤⼩的,只有当setLayout(null)的时候setSize,setLocation,setBounds⽅法才有实际⽤处
2.setPreferredSize可在有布局管理器的时⽣效,布局管理器会获取空间的preferredsize,因⽽可以⽣效
3.使⽤布局管理器会有很多局限性,许多控件的位置不能够正确的摆放,尤其是当有嵌套控件时如(JTextArea⾥插⼊图⽚,JScrollPane插⼊JTextArea)等情况时,布局管理器的作⽤会变得很鸡肋
4.使⽤setBounds⽅法可以将控件根据x,y直接插⼊JFrame中,同时也可以直接控件的⼤⼩,这个⽅法使布置控件更加灵活
对JavaSwing页⾯优化的理解
Swing属于⽐较⽼的⼯具集,⽣成的页⾯布局不好看。我尝试了很多的⽅法只能做到页⾯简洁,远远达不到美观。
我看到⽐较好的优化就是重写所有⿏标类函数,这样做的好处是可以⽤JTextArea来替代Button控件,重写⿏标悬停等函数可以使页⾯看起来更加⽣动
下⾯具体演⽰⼀下优化的代码
public void mouseDragged(MouseEvent e) {//重写窗⼝拖动函数
Point p = getLocation();
setLocation(p.x + e.getX() - origin.x, p.y + e.getY()- origin.y);
}
});
user.addFocusListener(new FocusListener() {//重写⿏标焦点函数
public void focusLost(FocusEvent e) {//失去焦点
}
public void focusGained(FocusEvent e) {//得到焦点
});
public void mousePressed(MouseEvent e){//重写⿏标点击函数
}
对于前后端交替问题的体会
此次Gui图形界⾯⼀个较难的问题就是前后端代码的交替,前端的QQ聊天界⾯要做到对信息的实时更新,与信息来时的按钮提醒。这两个功能的实现花费了很多的时间精⼒,下⾯对这两个问题详细讲解实现对信息显⽰的实时更新
实时更新信息分为  1.显⽰离线消息  2.显⽰在线消息  3.显⽰聊天记录
三个功能实现的⽅法⼤致相同
>>>>># 1.显⽰离线消息>>>>>###
public static void returnOfflineMessage(ArrayList<OfflineMessage> offlineMessages) {
for (OfflineMessage o : offlineMessages) {
if (Sender())) {
<(o.getSender()).add(o);
} else {
ArrayList<Message> messageArrayList = new ArrayList<>();
messageArrayList.add(o);
hashMap.Sender(), messageArrayList);
}
}
}
在上线前,先将所有获得的信息⽤HashMap存储,key为发送者,value为ArrayList<Message>
public static void setButton()
{
for (int i = 0; i < userItem.size(); i++) {//将⽤户创建button
if (!(i).getUserName().equals(sender)) {
JToggleButton jToggleButton = new (i).getUserName());
javaswing实现购买jToggleButtons.add(jToggleButton);
int finalI1 = i;
jToggleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jEditorPane.setText("");
receivingEnd = (finalI1).getUserName();
for (int i = 0; i < jToggleButtons.size(); i++) {//点击按钮后,把按钮颜⾊变为⽆
if ((finalI1).getUserName().(i).getText())) {
<(i).setBackground(null);
}
}
if (ainsKey(receivingEnd)) {
for (Message M : (receivingEnd)) {
Sender().equals(sender)){
jEditorPane.append("我" + " :" + M.getMessage() + "(" + M.getTime() + ")" + "\n");
}else {
jEditorPane.Sender() + " :" + M.getMessage() + "(" + M.getTime() + ")" + "\n");
}
}
}
}
});
userListjPanel.add(jToggleButton);
group.add(jToggleButton);
jToggleButton.setPreferredSize(new Dimension(10, 10));
}
}
}
从控制台获取UserIteam,并且以UserIteam的UserName动态创建button,这⾥button的使⽤了jToggleButton类型,并且运⽤了ButtonGroup的功能,
这样可以保证⼀个按钮有点下和没点下两种状态,并且每次只有⼀个Button能被点下。在点击Button后,令receivingEnd= (finalI1).getUserNam 这⾥对receivingEnd的赋值,就确定了哪个⽤户被点击,为显⽰信息做标识,接下来就对hashmap做遍历,输出所有发出者为该按钮的信息
>>>>>###2.显⽰在线消息>>>>>###
public static void returnOnlineMessage(OnlineMessage onlineMessage) {
Sender().equals(receivingEnd)){
//打印到屏幕
jEditorPane.Sender() + " :" + Message() + "(" + Time() + ")" + "\n");
}else{
//没点的button改变颜⾊
changeButton(onlineMessage);
}
Sender())){
<(Sender()).add(onlineMessage);
}else{
ArrayList<Message> tempList = new ArrayList<>();
tempList.add(onlineMessage);
hashMap.Sender(),tempList);
}
}
每次有信息来,把信息加⼊到hashmap,然后判断发送者是否是该按钮,是就打印该信息
>>>>>### 3.显⽰聊天记录>>>>>#
public static void returnHistoryList(ArrayList<HistoryMessage> list){
hashMap.clear();
for (Message m:list) {
Sender().equals(sender)){
ReceivingEnd())){
<(m.getReceivingEnd()).add(m);
}else{
ArrayList<Message> tempList = new ArrayList<>();
tempList.add(m);
hashMap.ReceivingEnd(),tempList);
}
}else{
Sender())){
<(m.getSender()).add(m);
}else{
ArrayList<Message> tempList = new ArrayList<>();
tempList.add(m);
hashMap.Sender(),tempList);
}
}
}
jEditorPane.setText("");
if(receivingEnd!=null){
for (Message M : (receivingEnd)) {
Sender().equals(sender)){
jEditorPane.append("我" + " :" + M.getMessage() + "(" + M.getTime() + ")" + "\n");
}else {
jEditorPane.Sender() + " :" + M.getMessage() + "(" + M.getTime() + ")" + "\n");                }
}
}
}
将HashMap清空,重新从后台获取所有历史消息,并且输出
信息来时的按钮提醒
1.
public static void changeButton(Message message) {
/**根据信息改变Button的颜⾊
*
*/
String username = Sender();
for (int i = 0; i < jToggleButtons.size(); i++) {
if (username.(i).getText())) {
<(i).setBackground(Color.RED);
}
}
}
登陆时,如果该⽤户存有信息,则改变该⽤户的button的颜⾊
2.
public static void returnOnlineMessage(OnlineMessage onlineMessage) {
Sender().equals(receivingEnd)){
//打印到屏幕
jEditorPane.Sender() + " :" + Message() + "(" + Time() + ")" + "\n");
}else{
//没点的button改变颜⾊
changeButton(onlineMessage);
}
Sender())){
<(Sender()).add(onlineMessage);
}else{
ArrayList<Message> tempList = new ArrayList<>();
tempList.add(onlineMessage);
hashMap.Sender(),tempList);
}
}
当有信息来时,如果点的这个Button不是发来信息的⽤户,则把Button变红⾊
2.功能演⽰
登陆界⾯
注册界⾯
聊天窗⼝
发送⽂件
3.尚未完成的功能
1.⾃⾏添加⽤户进⾏聊(由于时间的问题UI没来得及制作)
2.注册和聊天界⾯没得及重写函数优化
3.添加表情功能
需要改进和总结
1.第⼀次尝试合作写代码,前后端对接⽅⾯很不熟练,导致代码进度很慢,需要的⽅法写了⼜改写了⼜改浪费时间。
2.图形界⾯的代码是基于服务器之上的,信息显⽰的功能很难调试,没有办法单独运⾏调试
3.这次我的图形界⾯做的很简陋,只是实现了基本功能,没有做到界⾯美观,只有登陆的界⾯参考了别⼈的重写代码才有⼀点能看
4.今后学习Java的过程,应该多尝试合作编程,做好代码规范,写类应该先想好要写的⽅法再进⾏补充,不能东添西加导致代码可读性很差
5.代码还是要多敲,编程语⾔这⽅⾯做题集和实际敲项⽬还是有很⼤区别的,通过这次课设让我感受最深的还是敲代码的速度慢⼀点点的逻辑代码就要想很久4.gitee提交记录

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论