?? jim.java.bak
字號:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import javax.swing.border.*;
import java.util.Vector;
//Jim類是客戶端的主類。主要是創建一個Login類的對象,用于顯示用戶登陸界面。代碼如下:
public class Jim
{
public static void main(String[ ] args)//主程序
{
Login loginWin=new Login( );//創建一個Login類的對象
loginWin.setVisible(true);//顯示用戶登錄界面
}
}
//Login類為用戶登錄類,顯示用戶登錄界面,處理用戶登陸過程。代碼如下:
class Login extends JFrame //登錄窗口類
{
JPanel contentPane;
String serverName; //服務器名
int serverPort; //端口
JPanel jPanel1=new JPanel( ); //面板1
JLabel jlImNo=new JLabel( ); //用戶JIM號標簽
JTextField jtfImNo=new JTextField( ); //輸入用戶JIM號的文本框
JLabel jlPassword=new JLabel( ); //用戶口令標簽
JPasswordField jpfPassword=new JPasswordField( ); //輸入用戶口令的文本框
JPanel jPanel2=new JPanel( ); //面板2
JButton jbLogin=new JButton( ); //"登錄"按鈕
JButton jbNewUser=new JButton( ); //"注冊"按鈕
JButton jbQuit=new JButton( ); //"退出"按鈕
public Login( )
{
//激活窗口事件,使界面能響應窗口事件
enableEvents(AWTEvent.WINDOW_WVENT_MASK);
try
{
loginInit( ); //界面初始化
getServerConfig( ); //從配置文件中獲取服務器端的配置
}catch (Exception e){e.printStackTrace( );}
}
public void getServerConfig( ) //從配置文件中獲取服務器端的配置
{
try
{
File fileConfig=new File("config.txt");
BufferedReader br=new BufferedReader(new FileReader(fileConfig));
serverName=br.readLine( ).substring(11);
serverPort=Integer.parseInt(br.readLine( ).substring(11));
}
catch(Exception e1)
{
serverName="127.0.0.1";
serverPort=8080;
}
}
private void loginInit( )throws Exception //界面初始化
{
contentPane=(JPanel)this.getContentPane( );
contentPane.setLayout(null); //設置窗口布局為無布局管理器
this.setResizable(false); //窗口不能改變大小
this.setSize(new Dimension(350,250)); //指定窗口大小
this.setTitle("JIM用戶登陸"); //指定窗口標題
jPanel1.setBounds(new Rectangle(0,20,350,90)); //指定面板大小
jPanel1.setLayout(null); //指定面板1的布局為無布局管理器
jlImNo.setText("JIM號碼");
//指定標簽位置和大小
jlImNo.setBounds(new Rectangle(40,20,60,20));
//指定輸入用戶JIM號的文本框的位置和大小
jtfImNo.setBounds(new Rectangle(105,19,180,22));
jlPassword.setText("JIM密碼");
jlPassword.setBounds(new Rectangle(40,60,60,20));
jpfPassword.setBounds(new Rectangle(105,59,180,22));
jPanel2.setBounds(new Rectangle(1,120,344,100));
jPanel2.setLayout(null);
jbLogin.setText("登錄");
jbLogin.setBounds(new Rectangle(5,10,60,25));
//為"登錄"按鈕增加鼠標事件監聽器
jbLogin.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jbLogin_mouseClicked(e);
}
});
jbQuit.setText("退出");
jbQuit.setBounds(new Rectangle(85,10,60,25));
//為退出按鈕增加鼠標事件監聽器
jbQuit.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jbQuit_mouseClicked(e);
}
});
jbNewUser.setText("注冊");
jbNewUser.setBounds(new Rectangle(245,10,60,25));
//為"注冊"按鈕增加鼠標事件監聽器
jbNewUser.addMouseListener(new java.awt.event.MouseAdapter( ){
public void mouseClicked(MouseEvent e){
jbNewUser_mouseClicked(e);
}
});
//將面板1加到窗口上
contentPane.add(jPanel1,null)
//將標簽和文本框加到面板1上
jPanel1.add(jlImNo,null);
jPanel1.add(jtfImNo,null);
jPanel1.add(jlPassword,null);
jPanel1.add(jpfPassword,null);
//將面板2加到窗口上
contentPane.add(jPanel2,null);
//將按鈕加到面板2上
jPanel2.add(jbLogin,null);
jPanel2.add(jbQuit,null);
jPanel2.add(jbNewUser,null);
}
//以下為當發生窗口關閉事件時的動作
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID( )==WindowEvent.WINDOW_CLOSING){
System.exit(0); //程序退出
}
}
//以下為當發生"登錄"按鈕的Clicked事件將產生的動作
void jbLogin_mouseClicked(MouseEvent e)
{
try
{
//連接服務器
Socket socket=new Socket(InetAddress.getByName(serverName),serverPort);
//創建輸入輸出流
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//向服務器發送登錄請求
out.println("LOGIN");
out.println(jtfImNo.getText( ));
out.println(jpfPassword.getPassword( ));
String str=" ",msgStr=" ";
str=in.readLine().trim( );
msgStr=in.readLine().trim( );
//向服務器發出中斷通訊的消息
out.println("END");
//若服務器返回的消息是FALSE,將顯示出具體的錯誤內容
if(str.equals("FALSE"))JOptionPane.showMessageDialog(this,msgStr,"確定",JOptionPane.INFORMATION_MESSAGE);
else{
//若正確,則關閉通訊連接,并關閉窗口
socket.close( );
this.dispose( );
//打開JIM的界面
int g=Integer.parseInt(jtfImNo.getText( ));
JimWin jimWin=new JimWin(g,serverName,serverPort);
jimWin.setVisible(true);
}
}catch(IOException e1){}
}
//以下為"注冊"按鈕發生Clicked事件時的動作
void jbNewUser_mouseClicked(MouseEvent e)
{
JDialog d=new Register(serverName,serverPort);//打開注冊窗口
d.pack();
d.setLocationRelativeTo(this);//指定注冊窗口顯示的位置在本窗口位置
d.setSize(400,400); //指定注冊窗口的大小
this.dispose(); //關閉登錄窗口
d.show(); //顯示注冊窗口
}
//以下為退出按鈕發生事件時的動作
void jbQuit_mouseClicked(MouseEvent e)
{
this.dispose(); //關閉登錄窗口
System.exit(0); //程序退出
}
}
//Register類
//該類用于顯示用戶的注冊界面,并處理用戶的注冊請求。代碼如下:
class Register extends JDialog //注冊用戶類
{
JPanel jpBottom = new JPanel();
JLabel jlPrompt = new JLabel();
JTextField jtNickName = new JTextField();
JLabel jlNickName = new JLabel();
JLabel jlPassword = new JLabel();
JPasswordField jpfPassWord=new JPasswordField();
JComboBox jcbFace=new JComboBox();
JLabel jlSex= new JLabel();
JComboBox jcbSex=new JComboBox();
JLabel jlAge= new JLabel();
JTextField jftAge = new JTextField();
JLabel jlPhone = new JLabel();
JTextField jtfPhone = new JTextField();
JTextField jtfEMail = new JTextField();
JLabel jlEMail = new JLabel();
JLabel jlHomePage = new JLabel();
JTextField jftHomePage = new JTextField();
JLabel jlResume=new jLabel( );
JTextPane jtpResume = new JTextPane();
JButton jbOK= new JButton();
JLabel jbCancel = new JButton();
String serverName;//服務器名
int serverPort;//服務器端口
public Register(String s,int port) //構造函數
{
serverName=s;
serverPort=port;
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{
registerInit();//創建窗口
pack();
this.setResizable(false);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
void registerInit() throws Exception //初始化創建窗口
{
String[ ] pics; //存放頭像的圖像文件名
//以下為通過設置文件過濾器,用于查找圖像文件
FilenameFilter fileFilter=new FilenameFilter(){
public boolean accept(File dir,String name){
if(name.endsWith("_1.JPG")||name.endsWith("_1.jpg")){
return true;
}
return false;
}
};
File dir=new File("face"); //圖像文件存放在face目錄下
pics=dir.list(fileFilter);
jpBottom.setLayout(null);
this.getContentPane().setLayout(null);
jpBottom.setBounds(new Rectangle(0,0,550,550));
this.setTitle("注冊新用戶");
jlPrompt.setText("請填寫以下內容");
jlPrompt.setBounds(new Rectangle(10,10,100,20));
jlNickName.setText("昵稱");
jlNickName.setBounds(new Rectangle(36,40,45,20));
jtNickName.setBounds(new Rectangle(70,40,180,22));
jlPassword.setText("密碼");
jlPassword.setBounds(new Rectangle(36,70,60,20));
jpfPassWord.setBounds(new Rectangle(70,70,180,22));
//將顯示頭像的下拉列表框進行個性化設置
//使其能夠顯示圖標而不是平常的文字
ComboBoxModel model=new HeadPicCombobox(pics);
ListCellRenderer renderer=new HeadPicCellRenderer();
jcbFace.setBounds(new Rectangle(290,40,80,50));
jcbFace.setModel(model); //設置控件的模型
jcbFace.setRenderer(renderer); //安裝繪制器
jlSex.setText("性別");
jlSex.setBounds(new Rectangle(36,100,45,20));
jcbSex.setToolTipText("");
jcbSex.addItem("女");
jcbSex.addItem("男");
jcbSex.setBounds(new Rectangle(70,100,45,22));
jlAge.setText("年齡");
jlAge.setBounds(new Rectangle(135,100,50,20));
jtfAge.setBounds(new Rectangle(170,100,40,22));
jlPhone.setText("電話");
jlPhone.setBounds(new Rectangle(225,100,50,20));
jtfPhone.setBounds(new Rectangle(260,100,110,22));
jlEMail.setText("電子郵件");
jlEMail.setBounds(new Rectangle(10,130,60,20));
jtfEMail.setBounds(new Rectangle(70,130,300,22));
jlHomePage.setText("個人主頁");
jlHomePage.setBounds(new Rectangle(10,160,60,20));
jtfHomePage.setBounds(new Rectangle(70,160,300,22));
jlResume.setText("個人說明");
jlResume.setBounds(new Rectangle(10,190,60,20));
jtpResume.setBounds(new Rectangle(70,190,300,110));
jbOK.setText("確定");
jbOK.setBounds(new Rectangle(147,330,79,29));
jbOK.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jbOK_mouseClicked(e);
}
});
jbCancel.setText("取消");
jbCancel.setBounds(new Rectangle(260,329,79,29));
jbCancel.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jbCancel_mouseClicked(e);
}
});
this.getContentPane().add(jpBottom,null);
jpBottom.add(jlPrompt,null);
jpBottom.add(jlNickName,null);
jpBottom.add(jtNickName,null);
jpBottom.add(jlPassword,null);
jpBottom.add(jpfPassWord,null);
jpBottom.add(jcbFace,null);
jpBottom.add(jlSex,null);
jpBottom.add(jcbSex,null);
jpBottom.add(jlAge,null);
jpBottom.add(jtfAge,null);
jpBottom.add(jlPhone,null);
jpBottom.add(jtfPhone,null);
jpBottom.add(jtfEmail,null);
jpBottom.add(jlEmail,null);
jpBottom.add(jlHomePage,null);
jpBottom.add(jtfHomePage,null);
jpBottom.add(jlResume,null);
jpBottom.add(jtpResume,null);
jpBottom.add(jbOK,null);
jpBottom.add(jbCancel,null);
}
//處理"確定"按鈕的mouseClicked事件的方法
void jbOK_mouseClicked(MouseEvent e)
{
try
{
Socket socket=new Socket(InetAddress.getByName(serverName),serverPort);
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//按照通訊協議發送用戶注冊的請求
out.println("NEW");
out.println(jtNickName.getText( ).trim()); //昵稱
out.println(jpfPassWord.getPassword()); //口令
out.println(jcbFace.getSelectedIndex()+1); //頭像號
out.println(jcbSex.getSelectedIndex()); //性別
out.println(jtfAge.getText( ).trim()); //年齡
out.println(jtfEMail.getText( ).trim()); //EMail
out.println(jtfHomePage.getText( ).trim()); //個人主頁
out.println(jtfPhone.getText( ).trim()); //電話
out.println(jtpResume.getText( ).trim()); //個人簡介
//讀取服務器的返回信息
int no;
no=Integer.parseInt(in.readLine()); //返回的用戶JIM號
String str="";
str=in.readLine().trim(); //返回成功或失敗
//告訴服務器結束通訊
out.println("END");
socket.close();
if(str.equals("FALSE"));
JOptionPane.showMessageDialog(this,"對不起,出錯了:-(","OK",JOptionPane.INFORMATION_MESSAGE);
else
{//如果成功就告訴用戶其號碼
JOptionPane.showMessageDialog(this,"你的JIM號碼是"+no,"OK",JOptionPane.INFORMATION_MESSAGE);
this.dispose(); //關閉注冊窗口
JimWin jimWin=new JimWin(no,serverName,serverPort);
jimWin.setVisible(true);
}
}catch(IOException e1){ }
}
//處理"取消"按鈕的mouseClicked事件
void jbCancel_mouseClicked(MouseEvent e)
{
this.dispose();
System.exit(0);
}
//處理窗口的關閉事件
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING){
System.exit(0);
}
}
}
//JimWin類
//JIM主界面類。該類通過列表顯示出好友及好友的狀態,并通過快捷菜單的方式提供收發信息、查看好友資料、增加好友和刪除好友的功能。代碼如下:
class JimWin extends JFrame implements Runnable
{ int myImNo; //本人的JIM號
Vector myFriends=new Vector();//好友的列表
String[] faceOnline; //在線時好友圖像文件名
String[] faceOffline; //離線時好友圖像文件名
Thread thread; //接收信息線程
//以下是網絡相關變量
String serverName; //服務器名或IP地址
int serverPort; //服務器端口號
byte receiveBuf[ ]=new byte[512]; //UDP方式接收數據的數據緩沖區
DatagramPacket receivePacket; //接收數據報Packet
DatagramSocket receiveSocket; //接收數據報Socket
//默認接收消息的UDP端口號。
//若在同一臺計算機上啟動多個JIM端口號將自動加1
int udpPORT=5001;
//以下是程序界面的變量
JPanel contentPane;
JScrollPane jspList; //滾動面板
JList jlstFriend; //好友列表,將放置在滾動面板上
JPopupMenu jPopupMenu1=new JPopupMenu(); //快捷菜單
JMenuItem mnItemMsg=new JMenuItem(); //收發訊息菜單
JMenuItem mnItemInfo=new JMenuItem(); //查看資料菜單
JMenuItem mnItemAddFriend=new JMenuItem(); //增加好友菜單
JMenuItem mnItemDelFriend=new JMenuItem();//刪除好友菜單
//主程序構造方法
public JimWin(int s,String serverName,int serverPort)
{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{
myImNo=s; //得到自己的JIM號
this.serverName=serverName; //服務器名
this.serverPort=serverPort; //服務器TCP通訊端口號
mainWinInit(); //初始化界面
ConnectServer(myImNo); //連接服務器做登記工作和查詢好友
thread=new Thread(this); //創建監視接收消息端口的線程
thread.start(); //啟動監視接收消息端口的線程
}
catch(Exception e)
{
e.printStackTrace();
}
}
//初始化主程序界面
private void mainWinInit()throws Exception
{
//設置在線頭像的圖像文本過濾器
FilenameFilter fileFilterOn=new FilenameFilter(){
public boolean accept(File dir,String name){
if(name.endsWith("_1.JPG")||name.endsWith("_1.jpg")){
return true;
}
return false;
}
};
//設置離像頭像的圖像文件過濾器
FilenameFilter fileFilterOff=new FilenameFilter(){
public boolean accept(File dir,String name){
if(name.endsWith("_2.JPG")||name.endsWith("_2.jpg")){
return true;
}
return false;
}
};
//指定圖像文件的目錄在當前目錄的face子目錄下
File dir=new File("face");
//得到在線頭像的圖像文件列表
faceOnline=dir.list(fileFilterOn);
//得到離線頭像的圖像文件列表
faceOffline=dir.list(fileFilterOff);
this.getContentPane().setBackground(new Color(132,158,203));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -