《Java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告簡易聊天室系統(tǒng)
《《Java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告簡易聊天室系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《Java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告簡易聊天室系統(tǒng)(54頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、《Java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告 華 北 科 技 學(xué) 院 課程設(shè)計(jì)說明書 班級(jí): 信息與計(jì)算科學(xué)B091 學(xué)號(hào): 姓名: 設(shè)計(jì)題目: 簡易聊天室系統(tǒng) 設(shè)計(jì)時(shí)間: 2011.12.26 至 2011.12.30 指導(dǎo)教師: 評(píng) 語:________________________________ ________________________________________ ______________
2、___________________________ _________________________________________ _________________________________________ 評(píng)閱成績:__ __評(píng)閱教師:__ ___ 目 錄 1 引 言 1 1.1課程設(shè)計(jì)選題 1 1.2課程設(shè)計(jì)的目的 1 1.3本選題的設(shè)計(jì)背景 1 2.1 功能需求 1 2.2 系統(tǒng)的開發(fā)運(yùn)行環(huán)境 2 2 總體設(shè)計(jì) 2 3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計(jì) 2 3 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 3 4.1 登錄模塊 3 4.2 客戶端
3、注冊(cè)界面模塊 5 4.3 客戶端聊天模塊 8 4.4 服務(wù)器端模塊 10 4 小結(jié)和展望 13 參 考 文 獻(xiàn) 14 附 錄 15 使用說明書 15 源程序清單 18 -52- 1 引 言 1.1課程設(shè)計(jì)選題 《簡易聊天室系統(tǒng)》 1.2課程設(shè)計(jì)的目的 使學(xué)生鞏固和加深以Java 語言為基礎(chǔ)的面向?qū)ο缶幊碳夹g(shù)理論知識(shí)的理解,提高實(shí)際動(dòng)手編程能力的培養(yǎng),掌握以Java為核心的應(yīng)用軟件開發(fā)方案,達(dá)到能獨(dú)立閱讀、編制和調(diào)試一定規(guī)模的Java程序的水平。 1.3本選題的設(shè)計(jì)背景 聊天是是網(wǎng)絡(luò)中廣泛應(yīng)用的服務(wù)之一,特別是現(xiàn)在信息社會(huì)對(duì)聊天的依賴也
4、越累越大,我們品是在生活中很多人都在用的QQ就是一種很好的聊天工具,它不僅只是聊天那么簡單,其它的功能也非常強(qiáng)大?;贘ava語言在網(wǎng)絡(luò)編程中的廣泛應(yīng)用與我們基本每時(shí)每刻都在接觸的聊天系統(tǒng)。我選擇嘗試對(duì)一簡單的聊天系統(tǒng)進(jìn)行開發(fā)。 對(duì)本聊天系統(tǒng)開發(fā)的意義:網(wǎng)絡(luò)聊天系統(tǒng)交流是系統(tǒng)的關(guān)鍵目的所在,能讓我們?cè)诤唵蔚恼Z句中對(duì)復(fù)雜社會(huì)的了解;交流的過程中使得人與人之間距離徹底拉近,就像面對(duì)面的交談彼此之間沒有界限,沒有差別,只有心與心的共振。 它沒有壓抑,只有爭論,就是心靈之間的一種平臺(tái)。也是另一種交友的一種重要方式。缺少它你會(huì)感覺沒什么,但是你一旦有了它你會(huì)發(fā)現(xiàn)它是那么的重要。 需求分析 在信息
5、社中,信息是第一手資料,人們聊天也是信息的傳播。曾經(jīng)的會(huì)議及面談已不再發(fā)揮主宰作用了,隨著各種聊天工具的上市,大家都對(duì)聊天產(chǎn)生濃厚的興趣,聊天系統(tǒng)的存在也有了很大價(jià)值。 2.1 功能需求 用戶角度考察系統(tǒng)應(yīng)具有哪些功能及非功能性需求。 能實(shí)現(xiàn)用戶注冊(cè)、用戶的登錄、各客戶端能連接起來,服務(wù)器能與客戶端相連實(shí)現(xiàn)用戶之間信息的發(fā)送與共享。 2.2 系統(tǒng)的開發(fā)運(yùn)行環(huán)境 本系統(tǒng)開發(fā)平臺(tái): Java 本系統(tǒng)集成開發(fā)環(huán)境:MyEclipse 本系統(tǒng)運(yùn)行環(huán)境: windows 7 2 總體設(shè)計(jì) 3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計(jì) 聊天系統(tǒng) 客戶端 服務(wù)器 用戶登錄
6、 用戶注冊(cè) 建立連接 監(jiān)聽客戶 用戶數(shù)據(jù)操作 聊天 交互 3 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 4.1 登錄模塊 1.功能設(shè)計(jì) (1)主要實(shí)現(xiàn)用戶的登錄與注冊(cè)。 2.界面設(shè)計(jì) 圖1 登錄窗口 3模塊主要算法 (1)事件的處理方法 public void actionPerformed(ActionEvent e) { Object source = e.getSource();//"確定"按鈕 if(source == btnOk) { btnOkClick(); }//"取消"按鈕 if(source == b
7、tnCancle) { btnCancleClick(); }//“注冊(cè)”按鈕 if(source == btnRegist) { btnRegistClick(); } } (2)單擊btnOk按鈕處理方法 private void btnOkClick() { String username = txtName.getText(); String userpwd = new String(txtPwd.getPassword()); if(username.equals("")) { JOptionPane.show
8、MessageDialog(btnOk,"“用戶名”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if(userpwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.equals("haiersoft")) {//默認(rèn)密碼“haiersoft” //驗(yàn)證通過,隱藏登錄窗
9、口,顯示聊天主窗口 this.setVisible(false); //FrmMain frmMain = new FrmMain(); JFrame frmMain = RongQi.getFrm("FrmMain"); if (frmMain == null) { frmMain = new FrmMain (); RongQi.putFrm("FrmMain", frmMain); } //FrmMain frmMain = new FrmMain(); frmMain.setVisible(true);
10、} else { JOptionPane.showMessageDialog(btnOk,"錯(cuò)誤的用戶名或密碼","提示", JOptionPane.WARNING_MESSAGE); } } 4調(diào)試與測(cè)試 調(diào)試過程當(dāng)中,遇到密碼文本框設(shè)計(jì)沒有和實(shí)際設(shè)計(jì)符合,最后通過同學(xué)的一起解決了這個(gè)問題;在處理“取消”的事件時(shí)出現(xiàn)一點(diǎn)小錯(cuò)誤,經(jīng)過反復(fù)調(diào)試及對(duì)程序的時(shí)間分析發(fā)現(xiàn)將“取消”這個(gè)事件的處理錯(cuò)寫為“確定”按鈕。 4.2 客戶端注冊(cè)界面模塊 1.功能設(shè)計(jì) (1)有用戶的用戶名、昵稱、密碼、性別和頭像的選擇,用這些信息來實(shí)現(xiàn)用戶的注冊(cè)。 2.界面
11、設(shè)計(jì) 圖2 注冊(cè)窗口 3模塊主要算法 (1)創(chuàng)建一個(gè)頭像柵格布局指定的行數(shù)和列中。所有的部件都享有同等的布局的尺寸。 JPanel pimg = new JPanel(new GridLayout(2,5)); ButtonGroup bgimg = new ButtonGroup(); for (int i = 0; i < ckbImage.length; i++) { ckbImage[i] = new JRadioButton(String.valueOf(i + 1), new ImageIcon("images/"+(i + 1
12、) + ".gif")); ckbImage[i].addItemListener(new ImageLIstener()); bgimg.add(ckbImage[i]); pimg.add(ckbImage[i]);//頭像讀取 } (2)單擊btnOk按鈕處理的方法 private void btnOkClick() { String username = txtName.getText(); String nickname = txtNickname.getText(); String userpwd = new String(t
13、xtPwd.getPassword()); String repwd = new String(txtRePwd.getPassword()); int sex = 0; if (rbFemale.isSelected()) { sex = 1; } if (username.equals("")) { JOptionPane.showMessageDialog(btnOk,"“用戶名”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if(nickname.eq
14、uals("")) { JOptionPane.showMessageDialog(btnOk,"“昵稱”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if(userpwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.length() < 6 || userpwd.l
15、ength() > 10) { JOptionPane.showMessageDialog(btnOk,"“密碼”長度范圍在6~10之間","提示", JOptionPane.WARNING_MESSAGE); return; } if (repwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“確認(rèn)密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if (!repwd.equals(userpwd
16、)) { JOptionPane.showMessageDialog(btnOk,"“確認(rèn)密碼”和“密碼”必須相同","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.equals("haiersoft")) { JOptionPane.showMessageDialog(btnOk,"注冊(cè)成功","提示", JOptionPane.WARNING_MESSAGE); //調(diào)用btnCancleClick()方法,清空信息 btnCancleClick(
17、); } else { JOptionPane.showMessageDialog(btnOk,"注冊(cè)失敗","提示", JOptionPane.WARNING_MESSAGE); return; } } 4調(diào)試與測(cè)試 在調(diào)試用戶注冊(cè)界面曾出現(xiàn)當(dāng)選者用戶頭像時(shí)該頭像就被隱藏了,但我對(duì)程序中多次的調(diào)試,這個(gè)問題都沒有得到好的解決,最后我嘗試將頭像的大小改變這個(gè)問題就得得到圓滿的解決。 4.3 客戶端聊天模塊 1.功能設(shè)計(jì) (1)界面分為3部分:中間部分顯示所有聊天信息,右邊顯示所有在在線客戶,底部用于信息的輸入與發(fā)送。 2.界面設(shè)
18、計(jì) 圖3 聊天窗口 3模塊算法(或重要代碼段)―――只要求給出1-2主要模塊的算法 (1) 從服務(wù)器獲取聊天信息的線程,接受服務(wù)器發(fā)送信息的方法。 class GetMsgFromServer extends Thread { //private String strMsg = null; public GetMsgFromServer() { super(); } public void run() { try{ readMsg = new BufferedReader( new Inpu
19、tStreamReader(socketMsg.getInputStream())); do{ strMsg = readMsg.readLine(); //在文本域顯示聊天信息 txtContent.append(strMsg + "\n"); } while (strMsg != null); } catch(Exception e) { e.printStackTrace(); } } } (2)事件發(fā)送的處理方法 public void actionPerform
20、ed (ActionEvent e) { Object source = e.getSource(); if (source == btnSend) { String str = txtSend.getText(); if (!str.equals("")) { //網(wǎng)絡(luò)通信錯(cuò)誤 printMsg.println(nickname + ":" + str); printMsg.flush(); txtSend.setText(""); } } } 4調(diào)試與測(cè)試 測(cè)試結(jié)果的分析與討論,測(cè)試過程中遇到的主
21、要問題及采取的解決措施。 聊天室的設(shè)計(jì)是較為重要的部分,在先前簡單的界面設(shè)計(jì)時(shí)較為簡單,當(dāng)通過在該類中添加實(shí)現(xiàn)對(duì)發(fā)送按鈕監(jiān)聽時(shí)由于沒有定義該類的方法連接使得發(fā)送按鈕不能實(shí)現(xiàn)。對(duì)這個(gè)小問題的檢查較為簡單。 4.4 服務(wù)器端模塊 1.功能設(shè)計(jì) (1)界面分為3部分:中間顯示所有聊天信息,右邊顯示所有在線用戶,底部用于發(fā)送系統(tǒng)信息。 2.界面設(shè)計(jì) 圖4 服務(wù)器窗口 3模塊算法 (1)接收客戶發(fā)送聊天信息的線程 class GetMessageThread extends Thread { private String stringFromClient = null
22、; private BufferedReader bufferedReaderFromClient; public GetMessageThread(BufferedReader buffer) throws Exception { bufferedReaderFromClient = buffer; } public void run() { try { do { stringFromClient = bufferedReaderFromClient.readLine(); msgList.addFirst(strin
23、gFromClient); } while (!stringFromClient.toLowerCase().endsWith("bye")); int index = bufferedReader.indexOf(bufferedReaderFromClient); bufferedReader.remove(index); printWriter.remove(index); } catch (Exception e) { e.printStackTrace(); } } } (2)向所有客戶端發(fā)送消息的
24、線程 class SendMessageThread extends Thread { public SendMessageThread() throws Exception { super (); } public void run() { while (isRun) { try { String s = null; if (!msgList.isEmpty()) { s = (String) msgList.removeLast(); txtContent.append(s + "\n");
25、 for (int i = 0; i < printWriter.size(); i++) { if (printWriter.get(i) != null) { printWriter.get(i).println(s); printWriter.get(i).flush(); } } } else { sleep(100);//休眠 } } catch (Exception e) { e.printStackTrace();
26、 } } } } 4調(diào)試與測(cè)試 服務(wù)器的是聊天系統(tǒng)中很重要的部分,這個(gè)界面設(shè)計(jì)較為簡單,擋在當(dāng)中添加一些樹組件及對(duì)客服端信息的發(fā)送時(shí),問題接二連三的出現(xiàn),很多都出現(xiàn)異常,主要是由于在定義語句不小心出現(xiàn)專業(yè)術(shù)語錯(cuò)誤。特別是將字符流放字節(jié)流劉緩沖區(qū)當(dāng)中是后由于吧new給忘記了,在結(jié)果的運(yùn)行中,服務(wù)器總是接收不到客戶端信息,這個(gè)問題占據(jù)了我大半天得時(shí)間才叫我給檢查出來了。通過這句簡單的話我深感細(xì)節(jié)決定成敗。 4 小結(jié)和展望 對(duì)于本系統(tǒng)的實(shí)現(xiàn),首先是構(gòu)建一個(gè)聊天系統(tǒng)主要的框架,通過查找關(guān)于聊天系統(tǒng)的相關(guān)知識(shí),建立一個(gè)聊天系統(tǒng)主要由服務(wù)器和客戶端,用戶的登錄界面和注冊(cè)界面,這
27、是一個(gè)很簡易的聊天系統(tǒng)。 然后通過類的建立登錄窗口類FrmLogin客戶端窗口類Frmain、注冊(cè)界面窗口類FrmRegist、服務(wù)器類ChatSever;由這些類運(yùn)行出這幾個(gè)主要的窗口類,在通過一個(gè)容器類RongQi來存儲(chǔ)用戶的信息,通過類Config讀取相應(yīng)的鍵對(duì)應(yīng)信息。實(shí)現(xiàn)簡單的窗口界面的輸出。 其次是通過在這些類當(dāng)中添加事件處理,如用戶名是否錯(cuò)誤,密碼是否在規(guī)定范圍之內(nèi);客戶端與服務(wù)器之間的信息傳輸實(shí)現(xiàn),實(shí)現(xiàn)對(duì)按鈕的監(jiān)聽實(shí)現(xiàn)系統(tǒng)中群消息的發(fā)送。 最后,通過運(yùn)行服務(wù)器和登錄窗口,注冊(cè)一個(gè)用戶名實(shí)現(xiàn)用戶與服務(wù)器的鏈接,就可進(jìn)行在聊天室中聊天,實(shí)現(xiàn)聊天室功能。 體會(huì):在這個(gè)課程設(shè)計(jì)中
28、讓我體會(huì)到一個(gè)簡單的聊天系統(tǒng)也不是那么好實(shí)現(xiàn)的,只是簡單窗口的實(shí)現(xiàn)也要花費(fèi)一天半時(shí)間,然后通過用戶窗口之間添加對(duì)事件的處理監(jiān)聽器接口鏈接最終實(shí)現(xiàn)簡單聊天系統(tǒng)。本系統(tǒng)能實(shí)現(xiàn)在客戶端用戶聊天窗口中顯示用戶名昵稱和頭像,服務(wù)器端口能看見當(dāng)前用戶在線狀態(tài)并顯示用戶名和昵稱。實(shí)現(xiàn)多個(gè)用戶之間在線信息的發(fā)送;服務(wù)器能監(jiān)測(cè)當(dāng)前用戶所發(fā)信息。是現(xiàn)簡單的用戶聊天功能。 本系統(tǒng)有很多不足之處,再對(duì)用戶消息的發(fā)送當(dāng)中只能是在一個(gè)窗口實(shí)現(xiàn),就都是在一個(gè)聊天室里面,沒有私聊的實(shí)現(xiàn),用戶上線后顯示的頭像不是用戶當(dāng)前頭像,是按上線順序進(jìn)行排列的,很難區(qū)分客服端窗口中誰是當(dāng)前用戶,對(duì)于用戶下線時(shí)也存在區(qū)分不清;本人覺得在對(duì)
29、用戶信息的存儲(chǔ)與應(yīng)該建立一個(gè)數(shù)據(jù)庫會(huì)更好。 參 考 文 獻(xiàn) [1] 邵峰晶, Java SE程序設(shè)計(jì)高級(jí)教程 [M]. 北京:電子工業(yè)出版, 2010. [2] 耿祥義,張躍平,基于Java大學(xué)實(shí)用教程 [M]. 電子工業(yè)出版社, 2011 249-252.(宋體,小四號(hào),1.5行距) 附 錄 使用說明書 1.打開Eclipse運(yùn)行環(huán)境,打開文聊天系統(tǒng)的類ChatSever 點(diǎn)擊下圖箭頭所指按鈕運(yùn)行服務(wù)器。 圖5 ChatSever 類窗口 運(yùn)行的服務(wù)器窗口如下圖 圖6 運(yùn)行服務(wù)器窗口 2.在前面的基礎(chǔ)之上在打開運(yùn)行FrmLogin類,如下圖
30、 圖7 FrmLogin 類窗口 運(yùn)行窗口如下 圖8 聊天登錄窗口 3.可以進(jìn)行用戶注冊(cè)是,點(diǎn)擊“注冊(cè)”按鈕之后彈出如下注冊(cè)窗口 圖9 注冊(cè)窗口 4.注冊(cè)之后點(diǎn)擊返回到登錄界面登錄用戶上線,如下圖便可進(jìn)行聊天了如下“痞子蔡”的界面 圖10 聊天室狀態(tài)窗口 服務(wù)器界面如下圖 圖11 服務(wù)器狀態(tài)窗口 源程序清單 首先看看該系統(tǒng)類的組成如下圖 圖12 聊天室系統(tǒng)類窗口 (1)作為客戶端登錄窗口代碼 package com.kehuduan.聊天室; import java.awt.event.*; import javax.swing.
31、*; import com.容器.聊天室.RongQi; //作為客戶端登錄窗口 public class FrmLogin extends JFrame implements ActionListener { private JPanel p;//面板 private JLabel lblName, lblPwd;//姓名 密碼 標(biāo)簽 private JTextField txtName; //姓名 文本框 private JPasswordField txtPwd;// 密碼框 private JButton btnOk, btnCancle,btnRegist
32、;// "確定" "取消" "注冊(cè)" 按鈕 public FrmLogin() { super("聊天室登錄"); p = new JPanel(); p.setLayout(null); lblName = new JLabel("用戶名"); lblPwd = new JLabel("密 碼"); txtName = new JTextField(20); txtPwd = new JPasswordField(20); txtPwd.setEchoChar(*); btnOk =new JButton("確定"); btn
33、Cancle = new JButton("取消"); btnRegist = new JButton("注冊(cè)"); lblName.setBounds(30, 30, 60, 25); txtName.setBounds(95, 30, 120, 25); //初始大小和位置 lblPwd.setBounds(30,60,60,25); txtPwd.setBounds(95,60,120,25); btnOk.setBounds(30,90,60,25); btnCancle.setBounds(95,90,60,25); btnReg
34、ist.setBounds(160,90,60,25); btnOk.addActionListener(this); btnCancle.addActionListener(this); btnRegist.addActionListener(this); p.add(lblName); p.add(txtName); p.add(lblPwd); p.add(txtPwd); p.add(btnOk); p.add(btnCancle); p.add(btnRegist); this.add(p); this.setS
35、ize(250,170); this.setLocation(300, 300); //設(shè)置窗體不可改變大小 this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //事件處理方法 public void actionPerformed(ActionEvent e) { Object source = e.getSource(); //"確定"按鈕 if(source == btnOk) { btnOkClick();
36、 } //"取消"按鈕 if(source == btnCancle) { btnCancleClick(); } //“注冊(cè)”按鈕 if(source == btnRegist) { btnRegistClick(); } } //單擊btnOk按鈕處理方法 private void btnOkClick() { String username = txtName.getText(); String userpwd = new String(txtPwd.getPassword()); if(username.e
37、quals("")) { JOptionPane.showMessageDialog(btnOk,"“用戶名”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if(userpwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.equals("haiersoft")) {/
38、/默認(rèn)密碼“haiersoft” //驗(yàn)證通過,隱藏登錄窗口,顯示聊天主窗口 this.setVisible(false); //FrmMain frmMain = new FrmMain(); //frmMain.setVisible(true); JFrame frmMain = RongQi.getFrm("FrmMain"); if (frmMain == null) { frmMain = new FrmMain (); RongQi.putFrm("FrmMain", frmMain); } //F
39、rmMain frmMain = new FrmMain(); frmMain.setVisible(true); } else { JOptionPane.showMessageDialog(btnOk,"錯(cuò)誤的用戶名或密碼","提示", JOptionPane.WARNING_MESSAGE); } } //單擊btnCancle按鈕處理方法 private void btnCancleClick() { txtName.setText(""); txtPwd.setText(""); /*//隱藏當(dāng)前窗體
40、 this.setVisible(false); FrmRegist frmRegist = new FrmRegist(); //顯示注冊(cè)窗體 frmRegist.setVisible(true);*/ } //單擊btnRegist按鈕的處理方法 private void btnRegistClick() { //隱藏當(dāng)前窗體 this.setVisible(false); //FrmRegist frmRegist = new FrmRegist(); //從容器中獲取注冊(cè)窗體 JFrame frmRegist = Rong
41、Qi.getFrm("FrmGegist"); //如果為null,則創(chuàng)建注冊(cè)窗體,并放入容器中 if (frmRegist == null) { frmRegist = new FrmRegist (); RongQi.putFrm("FrmRegist", frmRegist); } //顯示注冊(cè)窗體 frmRegist.setVisible(true); } public static void main(String[] args) { //加載了一個(gè)和系統(tǒng)一樣風(fēng)格的異常 try { UIManager.set
42、LookAndFeel( UIManager.getSystemLookAndFeelClassName()); } //加載系統(tǒng)風(fēng)格 catch (Exception e) { } FrmLogin frmLogin = new FrmLogin(); frmLogin.setVisible(true); RongQi.putFrm("FrmLogin", frmLogin); } } (2)客戶端注冊(cè)窗口代碼 package com.kehuduan.聊天室; //客戶端注冊(cè)窗口 import j
43、ava.awt.GridLayout; import java.awt.event.*; import javax.swing.*; import com.容器.聊天室.RongQi; public class FrmRegist extends JFrame implements ActionListener { //繼承窗體 監(jiān)聽接口 private JPanel p; //標(biāo)簽 用戶名 昵稱 密碼 確認(rèn)密碼 性別 頭像 private JLabel lblName, lblNickname, lblPwd, lblRepwd, lblSex, lblImage;
44、 private JTextField txtName, txtNickname;// 姓名 昵稱 文本框 private JPasswordField txtPwd, txtRePwd;//密碼框 private JRadioButton rbMale, rbFemale; private JRadioButton[] ckbImage = new JRadioButton[8];//用于頭像選擇 private JButton btnOk, btnCancle, btnReturn;//確定 取消 返回 三個(gè)按鈕 //選中的頭像 private String
45、checkedHeadImg = null; public FrmRegist() {//構(gòu)造方法 super("用戶注冊(cè)"); p = new JPanel(null); lblName = new JLabel("用戶名:"); lblNickname = new JLabel("昵 稱:"); lblPwd = new JLabel("密 碼:"); lblRepwd = new JLabel("確認(rèn)密碼:"); lblSex = new JLabel("性 別:"); lblImage = new JLabel("頭 像:")
46、; txtName = new JTextField(20); txtNickname= new JTextField(20); txtPwd = new JPasswordField(20); txtRePwd= new JPasswordField(20); rbMale = new JRadioButton("男"); rbMale.setSelected(true);//默認(rèn) 性別為男 rbFemale = new JRadioButton("女"); //rbFemale.setSelected(true); JPanel pim
47、g = new JPanel(new GridLayout(2,5)); ButtonGroup bgimg = new ButtonGroup(); for (int i = 0; i < ckbImage.length; i++) { ckbImage[i] = new JRadioButton(String.valueOf(i + 1), new ImageIcon("images/"+(i + 1) + ".gif")); ckbImage[i].addItemListener(new ImageLIstener()); //ckbIma
48、ge[i].addItemListener(new ImageListener()); //此處有點(diǎn)問題 已解決 bgimg.add(ckbImage[i]); pimg.add(ckbImage[i]);//頭像讀取 } btnOk = new JButton("確定"); btnCancle = new JButton("取消"); btnReturn = new JButton("返回"); btnOk.addActionListener(this); btnCancle.addActionListener(this);
49、 btnReturn.addActionListener(this);//添加監(jiān)聽器 ButtonGroup bgsex = new ButtonGroup(); bgsex.add(rbMale); bgsex.add(rbFemale); //性別 數(shù)組 lblName.setBounds(30,30,60,25); txtName.setBounds(95, 30, 200, 25); lblNickname.setBounds(30, 60, 60, 25); txtNickname.setBounds(95, 60, 200, 25);
50、 lblPwd.setBounds(30,90,60,25); txtPwd.setBounds(95,90,200,25); lblRepwd.setBounds(30,120,60,25); txtRePwd.setBounds(95,120,200,25); lblSex.setBounds(30,150,60,25); rbMale.setBounds(95, 150, 60, 25); rbFemale.setBounds(160, 150, 60, 25); lblImage.setBounds(30, 180, 60, 25);
51、 pimg.setBounds(95,180,280,100); btnOk.setBounds(90,290,60,25); btnCancle.setBounds(155,290,60,25); btnReturn.setBounds(220,290,60,25); p.add(lblName); p.add(txtName); p.add(lblNickname); p.add(txtNickname); p.add(lblPwd); p.add(txtPwd); p.add(lblRepwd); p.add(txtR
52、ePwd); p.add(lblSex); p.add(rbMale); p.add(rbFemale); p.add(lblImage); p.add(pimg); p.add(btnOk); p.add(btnCancle); p.add(btnReturn); this.add(p); this.setSize(400, 380);//設(shè)置大小 this.setLocation(300,300);//設(shè)置坐標(biāo) //窗體不可改變大小 this.setResizable(false); this.set
53、DefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //事件處理方法 public void actionPerformed(ActionEvent e) { Object source = e.getSource(); //"確定"按鈕 if(source == btnOk) { btnOkClick(); } //"取消"按鈕 if(source == btnCancle) { btnCancleClick(); } //"返回"按鈕 if(source == bt
54、nReturn) { btnReturnClick(); } } //單擊btnOk按鈕處理的方法 private void btnOkClick() { String username = txtName.getText(); String nickname = txtNickname.getText(); String userpwd = new String(txtPwd.getPassword()); String repwd = new String(txtRePwd.getPassword()); int sex =
55、0; if (rbFemale.isSelected()) { sex = 1; } if (username.equals("")) { JOptionPane.showMessageDialog(btnOk,"“用戶名”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if(nickname.equals("")) { JOptionPane.showMessageDialog(btnOk,"“昵稱”不能為空","提示", JOptionPane.WA
56、RNING_MESSAGE); return; } if(userpwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.length() < 6 || userpwd.length() > 10) { JOptionPane.showMessageDialog(btnOk,"“密碼”長度范圍在6~10之間","提示", JOp
57、tionPane.WARNING_MESSAGE); return; } if (repwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"“確認(rèn)密碼”不能為空","提示", JOptionPane.WARNING_MESSAGE); return; } /*if (repwd.equals("")) { JOptionPane.showMessageDialog(btnOk,"確認(rèn)密碼不能為空","提示",JOptionPane.WARNING_MESSAGE);
58、 return; }*/ if (!repwd.equals(userpwd)) { JOptionPane.showMessageDialog(btnOk,"“確認(rèn)密碼”和“密碼”必須相同","提示", JOptionPane.WARNING_MESSAGE); return; } if (userpwd.equals("haiersoft")) { JOptionPane.showMessageDialog(btnOk,"注冊(cè)成功","提示", JOptionPane.WARNING_MESSAGE); //
59、調(diào)用btnCancleClick()方法,清空信息 btnCancleClick(); } else { JOptionPane.showMessageDialog(btnOk,"注冊(cè)失敗","提示", JOptionPane.WARNING_MESSAGE); return; } } //單擊btnCancle按鈕的處理方法 private void btnCancleClick() { //清空信息 txtName.setText(""); txtNickname.setText(""); txtPw
60、d.setText(""); txtRePwd.setText(""); rbMale.setSelected(true); } //單擊btnReturn的處理方法 private void btnReturnClick() { //隱藏當(dāng)前窗體 this.setVisible(false); //FrmLogin frmLogin = new FrmLogin(); JFrame frmLogin = RongQi.getFrm("FrmLogin"); if (frmLogin == null) { frmLogin = ne
61、w FrmLogin (); RongQi.putFrm("FrmLogin", frmLogin); } //顯示登錄窗體 frmLogin.setVisible(true); /*FrmLogin fralogin = new FrmLogin(); //顯示登錄窗體 fralogin.setVisible(true);*/ } //頭像選擇監(jiān)聽類 class ImageLIstener implements ItemListener { public void itemStateChanged(ItemEvent e) {
62、 JRadioButton source = (JRadioButton) e.getSource(); if(source.isSelected()) { //顯示邊框 source.setBorderPainted(true); checkedHeadImg = source.getText() + ".gif"; System.out.println(checkedHeadImg); } else { //隱藏邊框 source.setBorderPainted(false); }
63、 } } /*public static void main(String[] args) { FrmRegist frm = new FrmRegist (); frm.setVisible(true); }*/ //將FrmRegist,java中的main()方法去掉,使聊天室客戶端的入口界面是登登錄界面 } (3)客戶端主窗口界面代碼 package com.kehuduan.聊天室; //客戶端主窗口界面 import java.awt.event.*; import java.io.*; import
64、 .Socket; import java.util.StringTokenizer; import javax.swing.*; import com.容器.聊天室.Config; public class FrmMain extends JFrame implements ActionListener { //FrmMain 類實(shí)現(xiàn) ActionListener 接口 實(shí)現(xiàn)發(fā)送聊天信息的功能 private JSplitPane splitPaneV,splitPaneH;//分隔面板 private JScrollPane spCenter;//滾動(dòng)面板
65、 private JPanel pRight; //面板 private JPanel pdown; private JTextArea txtContent; //文本區(qū) private JLabel lblSend; // "輸入" 標(biāo)簽 private JTextField txtSend; // "輸入字符" 文本框 private JButton btnSend; // "發(fā)送" 按鈕 //三個(gè)屬性 //當(dāng)前聊天的用戶的用戶名 public static String username = "nie"; //當(dāng)前聊
66、天用戶的昵稱 public static String nickname = "QQ"; //當(dāng)前聊天用戶的頭像 public static String heading = "7.gif"; private Socket socketMsg; //用于消息傳遞的套接字 private Socket socketUser; //用于用戶傳遞套接字 //用于消息的輸入/輸出流(用于聊天信息傳遞) private PrintWriter printMsg; private BufferedReader readMsg; private ObjectOutputStream printUser; //用于用戶信息輸入流 private BufferedReader readUser; //用于用戶信息輸出流 private String strMsg = null; //構(gòu)造方法 public FrmMain() { super("聊天室"); txtContent = new JText
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識(shí)競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案