📄 clientframe.java
字号:
len=PubMsglist.size();
for(int i=0;i<len;i++){
tempPubMsg=(PublicMessage)PubMsglist.get(i);
PubMsgText.append(tempPubMsg.getstrLocaleDate()+"\n");
PubMsgText.append(tempPubMsg.getSenderName()+"\n");
PubMsgText.append(tempPubMsg.getPubMsg()+"\n");
PubMsgText.append("\n");
}
len=Msglist.size();
for(int i=0;i<len;i++){
tempmsg=(Message)Msglist.get(i);
MsgText.append(tempmsg.getstrLocaleDate()+"\n");
MsgText.append(tempmsg.getfromName()+"\n");
MsgText.append(tempmsg.getMsg()+"\n");
MsgText.append("\n");
}
}//public void Init()
public void send(Message msg,boolean RealTime){
System.out.println("in ClientFrame send(Message msg,boolean RealTime)");
System.out.println("准备调用Client send(Message msg,boolean RealTime)");
client.send(msg,RealTime);
}//public void send(Message msg,boolean RealTime)
public void send(User MyNewInfo){
System.out.println("in ClientFrame send(User MyNewInfo)");
System.out.println("真实姓名:"+MyNewInfo.getUserName());
System.out.println("职位:"+MyNewInfo.getJob());
System.out.println("准备调用Client send(User MyNewInfo)");
client.send(MyNewInfo);
}//public void send(User MyNewInfo)
public void RealTimeMsgReceiver(Message msg){
//首先通过查询Client的OnlineUsers/OfflineUsers找到User并由User生成DiagFrame
//接着通过查询Client的OnlineUsers/OfflineUsers找到User对应的Vector中的下标和在线状态
//通过检索到的下标使Jlist中相同下标的项目反色显示
//该实现方法要求OnlineUsers/OfflineUsers中条目和连个Jlist条目严格一致
//改进版将通过检索Jlist获得项目并反色显示,不必通过检索Client的OnlineUsers/OfflineUsers
//这种实现同样需要OnlineUsers/OfflineUsers中条目和连个Jlist条目严格一致
System.out.println("in ClientFrame RealTimeMsgReceiver() 正在交付即时信息");
User tempuser;
DiagFrame tempDiagframe;
int index; //该高亮条目的下标
tempuser=client.RegNameToUser(msg.getfromName());
if(tempuser==null) return;
tempDiagframe=(DiagFrame)DiagFrames.get(tempuser.getRegName());
if(tempDiagframe==null){
tempDiagframe=new DiagFrame(ClientFrame.this,myself,tempuser,tempuser.getOnlineState());
//最后一个参数取决于tempuser.getOnlineState()是因为可能刚刚在线发完消息就下线了
DiagFrames.put(tempuser.getRegName(),tempDiagframe);
}
System.out.println("in ClientFrame RealTimeMsgReceiver() 准备交付即时信息到Diagframe");
tempDiagframe.RealTimeMsgReceiver(msg);
index=client.RegNameToindex(msg.getfromName(),true);
if(index!=-1){
//高亮显示
OnlineList.setSelectedIndex(index);
OnlineList.setSelectionBackground(new Color(0,255,0));
}else{
index=client.RegNameToindex(msg.getfromName(),false);
//高亮显示
OfflineList.setSelectedIndex(index); //下标越界会如何处理?
OfflineList.setSelectionBackground(new Color(0,255,0));
}
/**************************下面代码因为不能在DiagFrame中显示好友发送来的信息所以显示在ClientFrame中*********/
/*****退而求其次的解决方案*****/
MsgText.append(msg.getstrLocaleDate()+" "+msg.getfromName());
MsgText.append("\n");
MsgText.append(msg.getMsg());
MsgText.append("\n");
/**************************上面代码因为不能在DiagFrame中显示好友发送来的信息所以显示在ClientFrame中*********/
}//public void RealTimeMsgReceiver(Message msg)
public void PubMsgReceiver(PublicMessage PubMsg){
PubMsgText.append(PubMsg.getstrDate()+"\n");
PubMsgText.append(PubMsg.getSenderName()+"\n");
PubMsgText.append(PubMsg.getPubMsg()+"\n");
PubMsgText.append("\n");
}//public void PubMsgReceiver(PublicMessage PubMsg)
public void UpdateUserlist(User user,boolean on){
//在更新之前Client中的Vector OnlineUsers,Vector OfflineUsers
//已经改变过了,所以JList中的项目和OnlineUsers,OfflineUsers是一致的
//此方法是public void UpdateUserlist(Vector OnlineUsers,Vector OfflineUsers)的改进版
//不必对整个Jlist重新刷新,只需在Jlist中调整个别条目,提高了性能
//根据on值改变两个JList的条目
}//public void UpdateUserlist(User user,boolean on)
public void UpdateUserlist(Vector OnlineUsers,Vector OfflineUsers){
//在更新之前Client中的Vector OnlineUsers,Vector OfflineUsers
//已经改变过了,所以JList中的项目和OnlineUsers,OfflineUsers是一致的
/*************************以下测试************************************/
System.out.println("in ClientFrame UpdateUserlist");
System.out.println("开始刷新Client中Jlist");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());
///System.out.println("两个Vector中条目修改之后");
//System.out.println("OnlineUsers中内容:");
//User testUser;
//for(int i=0,len=OnlineUsers.size();i<len;i++){
// testUser=(User)OnlineUsers.get(i);
// testUser.display();
// System.out.println();
//}
//System.out.println("OfflineUsers中内容:");
//for(int i=0,len=OfflineUsers.size();i<len;i++){
// testUser=(User)OfflineUsers.get(i);
// testUser.display();
// System.out.println();
//}
/*************************以上测试************************************/
//根据Client的OnlineUsers和OfflineUsers刷新两个JList的条目
//先清除后添加
JListOnlineModel.removeAllElements();
JListOfflineModel.removeAllElements();
for(int i=0,len=OnlineUsers.size();i<len;i++){
JListOnlineModel.addElement(OnlineUsers.get(i));
}
for(int i=0,len=OfflineUsers.size();i<len;i++){
JListOfflineModel.addElement(OfflineUsers.get(i));
}
}//public void UpdateUserlist(Vector OnlineUsers,Vector OfflineUsers)
public boolean isOnline(String RegName){
return client.isOnline(RegName);
}
public static void main(String args[]){
new ClientFrame().setVisible(true);
}//main()
}//class ClientFrame extends JFrame
class OnlineIconCellRenderer extends JLabel implements ListCellRenderer{
public OnlineIconCellRenderer(){setOpaque(true);}//JListIcon()----设置选中项目高亮显示
public Component getListCellRendererComponent(JList list, //所要画上图像的JList组件
Object value, //JList项目的值,如list.getModel().getElementAt(index)所返回的值
int index, //JList项目索引值
boolean isSelected, //判断JList项目是否被选中
boolean cellHasFocus){ //判断JList项目是否有焦点置入
if(value!=null){
setText(((User)value).getUserName());
setIcon(new ImageIcon(".\\pics\\"+(index+17)+".gif"));
//如果指定的文件不存在则运行时不会显示任何图片
}
if(isSelected){
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}//public Component getListCellRendererComponent()
}//class OnlineIconCellRenderer extends JLabel implements ListcellRenderer
class OfflineIconCellRenderer extends JLabel implements ListCellRenderer{
public OfflineIconCellRenderer(){setOpaque(true);}//JListIcon()----设置选中项目高亮显示
public Component getListCellRendererComponent(JList list, //所要画上图像的JList组件
Object value, //JList项目的值,如list.getModel().getElementAt(index)所返回的值
int index, //JList项目索引值
boolean isSelected, //判断JList项目是否被选中
boolean cellHasFocus){ //判断JList项目是否有焦点置入
if(value!=null){
setText(((User)value).getUserName());
setIcon(new ImageIcon(".\\pics\\"+(index+5)+".gif"));
}
if(isSelected){
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}//public Component getListCellRendererComponent()
}//class OfflineIconCellRenderer extends JLabel implements ListcellRenderer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -