📄 mainpane.java
字号:
private FriendUser getFriendUserFromList(int jqnum){
for(int i=0;i<listFriend.getModel().getSize();i++){
Object obj = listFriend.getModel().getElementAt(i);
if(obj instanceof FriendUser){
FriendUser friendUser = (FriendUser)obj;
if(friendUser.getJqnum()==jqnum)
return friendUser;
}
}
return null;
}
/**
* 退出事件。
*/
private void quit(){
JQMessage message = new JQMessage();
message.setType(24);
message.setObj(selfUser);
try {
oos.writeObject(message);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
}
closeClient();
thread.interrupt();
System.exit(0);
}
/*public static void main(String[] args) {
try {
//System.out.println(JQClient.class.getResource("../tools/simsun.ttc").getPath());
Font font = Font.createFont(Font.TRUETYPE_FONT, new File(MainPane.class.getResource("/tools/simsun.ttc").getPath()));
font = font.deriveFont(Font.PLAIN, 12);
SetFont.setFont(font);
} catch (FontFormatException e) {
System.out.println("错误:"+e.getMessage());
} catch (IOException e) {
System.out.println("错误:"+e.getMessage());
}
new MainPane("",0,0,"",1);
}*/
/**
* 窗体关闭时触发事件。
*/
private class MyWindowAdapter extends WindowAdapter{
public void windowClosing(WindowEvent e) {
//super.windowClosing(e);
quit();
}
}
/**
* 自己定制的好友类表的ListCellRenderer
* 2008-9-27
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
private class CompanyLogoListCellRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus){
Component retValue = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
//System.out.println(value.toString());
if(value instanceof FriendUser){
FriendUser user = (FriendUser)value;
setIcon(new Portrait(user.getPhoto(),user.getState()));
setToolTipText("<html>"+user.getNickName()+"["+user.getJqnum()+"]"+"<br><font color='red'>"+user.getSignature()+"</font></html>");
}
return retValue;
}
}
/**
* 鼠标事件,完成鼠标进入好友List中,选中好友,双击与好友进行聊天等。
* 2008-9-27
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
private class ListMouseAdapter extends MouseAdapter{
public void mouseMoved(MouseEvent e) {
//System.out.println(e.getSource());
if(e.getSource()==listFriend){
listFriend.clearSelection();
int index = listFriend.locationToIndex(e.getPoint());
//System.out.println("index:"+index);
listFriend.setSelectedIndex(index);
}
}
public void mouseClicked(MouseEvent e) {
if(e.getSource()==listFriend ){
if(e.getClickCount()==2){
chatWithFriend();
}
if(e.getButton()==MouseEvent.BUTTON3){
popupMenu.show(listFriend, e.getX(), e.getY());
}
return;
}
if(e.getSource()==btnMenu){
menu.show(btnMenu, e.getX()-25, e.getY()-75);
}
if(e.getSource()==btnSys){
broadcastwindow.showNow();
}
}
}
/**
* 打开好友聊天窗口。
*/
private void chatWithFriend(){
Object obj = listFriend.getSelectedValue();
if(obj instanceof FriendUser){
FriendUser friendUser = (FriendUser)obj;
int jqnum = friendUser.getJqnum();
ChatPane chatPane = chat.get(jqnum);
if(chatPane==null){
chatPane = new ChatPane(oos,friendUser,selfUser,true);
chat.put(jqnum, chatPane);
}
else if(chatPane.isDisplayable()){
chatPane.setFocusable(true);
chatPane.setState(NORMAL);
}
else{
chatPane.setVisible(true);
}
}
}
/**
* 登陆线程。处理服务端的信息以及发送消息到服务端。
* 2008-9-27
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
private class LoginThread extends Thread{
public LoginThread(){
try {
client = new Socket(serverIp,serverPort);
MainPane.this.addWindowListener(new MyWindowAdapter());
oos = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
LoginUser loginUser = new LoginUser();
loginUser.setJqnum(jqnum);
loginUser.setPassword(password);
loginUser.setState(state);
JQMessage message = new JQMessage();
message.setType(20);
message.setObj(loginUser);
new WriteThread(message).start();
ois = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
//oos = new ObjectOutputStream(client.getOutputStream());
//ois = new ObjectInputStream(client.getInputStream());
} catch (UnknownHostException e) {
closeClient();
JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!"+e.getMessage());
dispose();
new LoginPane();
} catch (IOException e) {
closeClient();
JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!"+e.getMessage());
dispose();
new LoginPane();
}
}
public void run() {
try {
JQMessage message = null;
while(ois!=null){
Object obj = ois.readObject();
if(obj instanceof JQMessage){
message = (JQMessage)obj;
int type = message.getType();
switch(type){
case 21://登陆成功
if(message.getObj() instanceof Vector) {
Vector<FriendUser> v = (Vector)message.getObj();
initMain(v);
}
break;
case 22://登录失败
closeClient();
JOptionPane.showMessageDialog(null, message.getObj().toString());
dispose();
new LoginPane();
break;
case 23://账号在别处登录
causeLetClientQuit(message);
break;
case 25://好友上线
dealFriendUserLogin(message);
break;
case 31://接收到消息
dealRecord(message.getObj(),type);
break;
case 41://接受当前在线用户数
dealOnlineNum(message.getObj());
break;
case 43://接受在线的用户显示到table上
dealShowOnlineUser(message.getObj());
break;
case 45:
JOptionPane.showMessageDialog(null, message.getObj().toString());
break;
case 46:
JOptionPane.showMessageDialog(null, message.getObj().toString());
break;
case 90://服务端退出
causeLetClientQuit(message);
break;
case 91:
dealBroadcast(message);
break;
}
}
}
} catch (IOException e) {
System.out.println("发生异常:"+e.getMessage());
closeClient();
JOptionPane.showMessageDialog(null, "和服务端连接发生错误:"+e.getMessage()+",请重新登录!");
System.exit(0);
} catch (ClassNotFoundException e) {
System.out.println("发生异常:"+e.getMessage());
closeClient();
JOptionPane.showMessageDialog(null, "和服务端连接发生错误:"+e.getMessage()+",请重新登录!");
System.exit(0);
}
}
}
/**
* 处理广播。
* @param message JQMessage消息对象。
*/
private void dealBroadcast(JQMessage message){
newMSG(message.getType());
if(broadcastwindow!=null){
broadcastwindow.txt.setText(message.getObj().toString());
broadcastwindow.showNow();
}
}
/**
* 有消息来时出发声音。
* @param type 消息的类型。
*/
private void newMSG(int type){
//播放*.au文件时建议使用下面的方法
// AudioClip audioClip = null;
// if(n==31)
// audioClip = Applet.newAudioClip(MainPane.class.getResource("../sound/msg.au"));
// if(n==91)
// audioClip = Applet.newAudioClip(MainPane.class.getResource("../sound/system.au"));
// audioClip.play();
//播放*.wav文件时建议使用下面的方法
try {
AudioStream audioStream = null;
switch (type) {
case 25:
audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/global.wav"));
break;
case 31:
audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/msg.wav"));
break;
case 91:
audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/system.wav"));
break;
default:
audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/msg.wav"));
break;
}
AudioPlayer.player.start(audioStream);
} catch (IOException e) {
System.out.println("在播放声音文件时[type="+type+"],发生异常:"+e.getMessage());
}
}
/**
* 处理好友上线时消息。
* @param message
*/
private void dealFriendUserLogin(JQMessage message){
Object obj = message.getObj();
if(obj instanceof FriendUser){
newMSG(message.getType());
FriendUser friendUser = (FriendUser)obj;
if(listModel.contains(friendUser)){
for(int i=0;i<listModel.getSize();i++){
Object object = listModel.get(i);
if(object instanceof FriendUser){
FriendUser user = (FriendUser)object;
if(user.equals(friendUser)){
user.setState(friendUser.getState());
user.setPhoto(friendUser.getPhoto());
user.setNickName(friendUser.getNickName());
user.setSignature(friendUser.getSignature());
listFriend.repaint();
break;
}
}
}
//更改聊天窗口的图标
ChatPane chatPane = chat.get(friendUser.getJqnum());
if(chatPane!=null)
chatPane.updateFriendPhoto(new Portrait(friendUser.getPhoto(),friendUser.getState(),false));
}else{
listModel.addElement(friendUser);
chat.put(friendUser.getJqnum(), null);
listFriend.repaint();
}
}
}
/**
* 根据服务端发送的消息,将在线用户显示到查找面板上。
* @param obj 在线用户。
*/
private void dealShowOnlineUser(Object obj){
if(obj instanceof FriendUser)
findWindow.addOnlineUser((FriendUser)obj);
}
/**
* 显示在线用户数到查找面板上。
* @param obj 在线用户数。
*/
private void dealOnlineNum(Object obj){
if(obj instanceof Integer){
int size = (Integer)obj;
findWindow.lblOnlineNum.setText("当前在线人数 : "+size);
}
}
/**
* 处理服务端发送的从好友发过来的消息。
* @param obj Record对象。
* @param type 消息类型。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -