版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Class: ChatFrameimport java.awt.BorderLayout;/這是一個布置容器的邊框布局,它可以對容器組件進(jìn)行安排,并調(diào)整其大小,使其符合下列五個區(qū)域:北、南、東、西、中。import import/Dimenimportjava.awt.Container;java.awt.Dimen;類封裝單個對象中組件的寬度和高度(精確到整數(shù))。java.awt.GridBagConstras;/每個由 GridBagLayout 管理的組件都與 GridBagConstras 的實例相關(guān)聯(lián)。 Constras 對象指定組件的顯示區(qū)域在網(wǎng)格中的具體放置位置,以及組件在其顯示
2、區(qū)域中的放置方式。import java.awt.GridBagLayout;/GridBagLayout 類是一個靈活的布局管理器,它不要求組件的大小相同便可以將組件垂直、水平或沿它們的基線對齊。import java.awt.Insets;/Insets 對象是容器邊界的表示形式。它指定容器必須在其各個邊緣留出的空間。這個空間可以是邊界、空白空間或標(biāo)題。import import import import import import import import importimportjava.awt.event.ActionEvent; java.awt.event.ActionLis
3、tener; .InetSocketAddress; .SocketAddress;.SocketException;javax.swing.DefaultListM javax.swing.JButton; javax.swing.JFrame; javax.swing.JList;javax.swing.JOptionPane;/JOptionPane 有助于方便地彈出要求用戶提供值或向其發(fā)出通知的標(biāo)準(zhǔn)import javax.swing.JPanel;import javax.swing.JScrollPane;框。/JScrollPane 管理視口、可選的垂直和水平滾動條以及可選的行和
4、列標(biāo)題視口。import import importimportjavax.swing.JTextArea;javax.swing.ListSelectionM;javax.swing.event.ListSelectionEvent;javax.swing.event.ListSelectionListener;publicclass ChatFrame implements MessageHandler private private private private privateprivateJFrame frame; JTextArea recvMsg; JTextArea enter
5、Msg; JList userList; JButton addUserBtn;JButton sendBtn;private private private privateprivateDefaultListM String name;port;userListM;Messenger messenger;sic final String ECHO_STRING = echo;public ChatFrame() buildGUI();init();private void buildGUI() frame = new JFrame(); frame.setSize(600, 380);fra
6、me.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ChatUtils.locateFrameCenter(frame);recvMsg = new JTextArea(); recvMsg.setRows(1); recvMsg.setColumns(10);JScrollPane scrollRecv = new JScrollPane(recvMsg); recvMsg.setEditable(false);enterMsg = new JTextArea();JScrollPane scrollEnter = new JScrollPa
7、ne(enterMsg);scrollEnter.setMinimumSize(new Dimen(100, 80);(100, 80);scrollEnter.setPreferredSize(newDimen(););userListM userList =addUserBtn= new DefaultListMnew JList(userListM= new JButton(添加好友);sendBtn = new JButton(發(fā)送消息); JPanel sendPanel = new JPanel(); sendPanel.setLayout(new BorderLayout(7,s
8、endPanel.add(scrollEnter, BorderLayo0);ENTER);sendPanel.add(sendBtn, BorderLayout.EAST); JPanel userListPanel = new JPanel();JScrollPane scrollUserList = new JScrollPane(userList);scrollUserList.setMinimumSize(new DimenscrollUserList.setPreferredSize(new Dimen(80, 80);(80, 80);userListPanel.setLayou
9、t(new BorderLayout(0, 3);userListPanel.add(scrollUserList, BorderLayoENTER);userListPanel.add(addUserBtn, BorderLayout.SOUTH);Container container = frame.getContentPane(); container.setLayout(new GridBagLayout();GridBagConstra gbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth =s gbc = new GridBagConstras();
10、1;gbc.gridheight = 1;gbc.weightx = 1.0;gbc.weighty = 1.0;gbc.fill = GridBagConstras.BOTH; gbc.insets = new Insets(7, 7, 7, 7); container.add(scrollRecv, gbc); gbc.gridx = 1;gbc.gridy = 0;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 0;gbc.fill = GridBagConstras.BOTH; gbc.insets
11、= new Insets(7, 0, 7, 7); container.add(userListPanel, gbc); gbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1.0;gbc.insets = new Insets(0, 7, 7, 7);gbc.fill = GridBagConstras.BOTH;container.add(sendPanel, gbc);private void init() while (true) String initValue = new St
12、ring 端口:, 7777 ; 用戶名:, Alex ,InputMessageDialog initDialog = new InputMessageDialog(frame, 請輸入用戶名和端口, true, initValue); initDialog.setVisible(true);String nameAndPort = initDialog.getValue();if (nameAndPort = null) continue; = nameAndPort0;if (name.indexOf(ChatUtils.SEPARATOR) != -1) String
13、 errMsg = 用戶名中不能包含: + ChatUtils.SEPARATOR; JOptionPane.showMessageDialog(frame, errMsg, 錯誤的用戶名, JOptionPane.ERROR_MESSAGE);continue;try this.port =eger.valueOf(nameAndPort1);if (port 65536) String errMsg = 錯誤的端 + nameAndPort1+ 。端必須在0和65536之間;JOptionPane.showMessageDialog(frame, errMsg, 錯誤的端 JOptionP
14、ane.ERROR_MESSAGE);continue; catch (NumberFormatException ex) ,JOptionPane.showMessageDialog(frame, 輸入的端不是數(shù)字。, 錯誤的端,JOptionPane.ERROR_MESSAGE);continue;break;try messenger = new UDPMessagort);messenger.setMessageHandler(this); messenger.startMessenger(); catch (SocketException e) JOptionPane.showMes
15、sageDialog(frame, 端已被占用。程序?qū)⑼顺? 端已被占用,JOptionPane.ERROR_MESSAGE); System.exit(1);addUserBtn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) addUser(););sendBtn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) sendChatMessage(););userL
16、ist.setSelectionM;istSelectionM.SINGLE_SELECTION)userList.addListSelectionListener(new ListSelectionListener() public void valueChanged(ListSelectionEvent e) Object selection if (selection = return;= userList.getSelectedValue();null | !(selection instanceof UserM) UserMuser =(UserM) selection;recvMs
17、g.setText(user.getMessageHistory().toString(); updateTitle(););updateTitle();private void updateTitle() String title = name + 的聊天窗口,通訊端口為 + port; Object selection = userList.getSelectedValue();if (selection != null & (selection instanceof UserM) title = title + 。對方為 + (UserMthis.frame.setTitle(title
18、);private void sendChatMessage() ) selection).getName();Object selection = userList.getSelectedValue();if (selection = null | !(selection instanceof UserM) JOptionPane.showMessageDialog(frame, 請先選擇好友,再發(fā)送消息, 請選擇好友, JOptionPane.ERROR_MESSAGE); return;UserMuser = (UserM) selection;String content = ente
19、rMsg.getText(); sendMessage(content, user.getAddr(); if (content.length() = 0) return;enterMsg.setText();user.getMessageHistory().append(name + 說:rn + content + rn); recvMsg.setText(user.getMessageHistory().toString();private void addUser() String defaultUser = new String IP地址:, , 端:, 7777
20、 ;InputMessageDialog us輸入好友信息,true, defaultUser);rop = new InputMessageDialog(frame,請usrop.setVisible(true);String value = us if (value = null) return;rop.getValue();InetSocketAddress socketAddr = ChatUtils.createSocketAddrFromStr( value0, value1);if (socketAddr = null) JOptionPane.showMessageDialog
21、(frame, 輸入的信息錯誤,無法識別的IP地址和端,信息錯誤, JOptionPane.ERROR_MESSAGE);return;sendMessage(ECHO_STRING, socketAddr);private void sendMessage(String content, SocketAddress addr) byte data = ChatUtils.buildMessage(name, content); messenger.sendData(data, addr);public void showFrame() this.frame.setVisible(true);
22、Overridepublic void handleMessage(byte data, SocketAddressString content = ChatUtils.parseMessage(data);addr)String String UserMUserMuserName = content0; message = content1;newUser = new UserM(userName, addr);user = findUser(newUser);= null) if (useruserListM.addElement(newUser);user = newUser;if (m
23、essage.equals(ECHO_STRING) this.sendMessage(, addr); return;if (message.length() 0) user.getMessageHistory().append(userName + 說:rn + message + rn);userList.setSelectedValue(user, true); updateChatHistory(user.getMessageHistory().toString();private void updateChatHistory(String history) recvMsg.setT
24、ext(history);lastLineStart if (lastLineStart return;recvMsg.setCaretprivate UserMn = userListM= history.lastIndexOf(n);= -1) ition(lastLineStart);findUser(UserM.getSize();m) for (UserMi = 0; i n; i+) user = (UserM) userListM.get(i);if (user.equals(m) returnreturnclauser;null;serMprivate privatepriva
25、teString name; SocketAddress addr;StringBuffer messageHistory;public UserM(String name, SocketAddressaddr) = name;this.addr = addr;messageHistory = new StringBuffer();public returnpublicStringBuffer getMessageHistory() messageHistory;void setMessageHistory(StringBuffer messageHistory)this.
26、messageHistory = messageHistory;public returnpublicString getName() name;void setName(String name) = name;public returnpublicSocketAddress getAddr() addr;void setAddr(SocketAddress addr) this.addr = addr;Override public finalhashCode() prime = 31;result = 1;resultreturnpublic return= prime
27、 * result + (addr = null)result;?0:addr.hashCode();String toString() name;Overridepublicequals(Object obj) if (this = obj)return true;if (obj = null) return false;if (getClass() !=return false;obj.getClass()UserMother =(UserMnull) obj;if (addr = null)if (other.addr !=return else return returnfalse;i
28、f (!addr.equals(other.addr)false; true;Class: ChatFrameMainpublic class ChatFrameMain public sic void main(String args) ChatFrame chat = new ChatFrame(); chat.showFrame();Class: InputMessageDialogimport import import import import import import import import import import importpublicjava.awt.Contai
29、ner; java.awt.Frame; java.awt.GridBagConstra java.awt.GridBagLayout;java.awt.Insets;s;java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.JButton; javax.swing.JDialog; javax.swing.JLabel; javax.swing.JSeparator; javax.swing.JTextField;class InputMessageDialog extends JDialog priva
30、te privateprivateString items; JTextField values;String retValues;public InputMessageDialog(Frame owner, String title,String items) modal,super(owner, this.items = init();private voidtitle,items;modal);init()= this.getContentPane();Container containercontainer.setLayout(new GridBagLayout();GridBagConstras gbc = new GridBagConstras();count = items.length; gbc.gridx = 0;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.fill =gbc.insetsGridBagConstra= new Insets(3,= 0; i count;s.NONE; 3, 3, 3);i+) for (igbc.gridy = i;container.add(new JLabel(itemsi0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年四川單招遞補(bǔ)錄取專項沖刺卷含答案補(bǔ)錄考生專用
- 2025重慶市銅梁區(qū)少云鎮(zhèn)公益性崗位招聘1人考試備考題庫及答案解析
- 2025廣西南寧市興寧區(qū)昆侖鎮(zhèn)便民服務(wù)中心公益性崗位人員招聘1人筆試備考題庫及答案解析
- 2026年福建莆田市城廂區(qū)新任教師公開考核招聘20人筆試參考題庫及答案解析
- 2025四川資陽安岳縣第三人民醫(yī)院臨床醫(yī)師招引8人筆試參考題庫及答案解析
- 2025年合肥長豐縣某國有企業(yè)補(bǔ)充招聘工作人員3名考試參考題庫及答案解析
- 2025福建福州工業(yè)園區(qū)開發(fā)集團(tuán)有限公司勘察設(shè)計分公司招聘1人考試參考題庫及答案解析
- 2025年福建省三明市沙縣區(qū)第一中學(xué)高中招教師編內(nèi)7人筆試備考試題及答案解析
- 2025上海楊浦區(qū)鴻俊保安服務(wù)有限公司招聘7人考試參考題庫及答案解析
- 2025河南鄭州市金水區(qū)總醫(yī)院特招醫(yī)學(xué)院校畢業(yè)生招聘37人筆試參考題庫及答案解析
- DL∕T 1785-2017 電力設(shè)備X射線數(shù)字成像檢測技術(shù)導(dǎo)則
- T-CCIIA 0004-2024 精細(xì)化工產(chǎn)品分類
- 世界當(dāng)代史教材
- 至美無相-現(xiàn)代數(shù)學(xué)天文物理漫談智慧樹知到期末考試答案章節(jié)答案2024年中國海洋大學(xué)
- 《創(chuàng)傷失血性休克中國急診專家共識(2023)》解讀
- 王立銘進(jìn)化論講義
- Hyperion預(yù)算管理信息系統(tǒng)介紹
- 2023版設(shè)備管理體系標(biāo)準(zhǔn)
- 第三、四單元綜合測試卷(含答案)-統(tǒng)編版語文高一下學(xué)期必修下冊
- 基本心理需要滿足量表BPNS
- 焊縫外觀檢驗規(guī)范(5817 VT)
評論
0/150
提交評論