分享

javaQQ聊天程序详解

 昵称7369714 2011-07-27
rageh贡献

Awt/Swing 包(界面)
1. 一个 java 窗体的大致流程: 窗体(Frame)――容器(Container) ――(设置容器布局)――面板 (Panel)――(设置面板布局)――控件 1.1 如何实现窗体 在 Java 程序中,我们如果想创建并运行一个窗体,就必须让我们编写的类 继承自 JFrame 类,而使用 JFrame 类之前必须导入 java.awt.* 和 java.swing.* . [例1] import java.awt.*; import javax.swing.*; class Example1 extends JFrame{ Example1(){ //窗体的构造函数 this.setSize(300,200); //设置窗体的大小,300 是窗体的宽,200 是窗体高 this.setLocation(150,250); //设置窗体出现在屏幕的位置 } public static void main(String args[]){ Example1 ex=new Example1(); //实例化窗体类 ex.show(); //调用对象的 show()方法 } } 1.2 窗体中的 Container: 如果我们要往空白的窗体中加入其它东西,我们首先需要一个 Container(容器)为基础,就像在一个中空的架子上搭了一块木板,然后我 们就可以在板子上放我们想放的东西. 我们可以在[例1]的构造函数中加入: Container con = this.getContentPane(); 这样一来窗体就获得了容器. 就像: Example1(){ this.setSize(300,200); this.setLocation(150,250); Container con = this.getContentPane(); //窗体获得容器 } 1.3 容器中的面板:
面板(Panel)是包含在窗口中盛放控件的中间级别的容器.它将被 Container 对象包容.我们用它来归纳各种各样的控件,就像我们平常放置小东 西用的带有格子的抽屉. 1.4 如何加载控件: 控件类包括 JTextField,JLabel,JButton 等等.声明您想加入窗体的控 件,并调用面板对象的 add()方法把控件放入面板. [例2] import java.awt.*; import javax.swing.*; public class example2 extends JFrame{ public example2(){ this.setSize(300,200); this.setLocation(150,250); Container con=this.getContentPane( ); JPanel p1=new JPanel(); con.add(p1); JTextField text=new JTextField(10); 框 JButton button=new JButton("ok");
//声明并创建面板 //面板添加到容器中 //声明并创建一个文本 //声明并创建一个按钮
p1.add(text); p1.add(button); } public static void main(String[] args){ example2 ex=new example2(); ex.show(); } } 运行结果如下:
//面板添加文本框 //面板添加按钮
(图1)
1.5 设置 Container 和面板的布局(Layout):
我们不能任由控件在窗体上随便乱放,这样就像一个没有打扫的屋子,看 起来不会让人愉快.我们需要一些工具来为我们实现井井有条的布局.我 们就可以声明一些用于设置窗体布局的对象. 实现布局的类有: FlowLayout(流式布局)――窗体默认的布局,控件从左到右排列(如图 1),到了窗体盛不下一列的时候就从上到下排列. BorderLayout(边框式布局)――使用此布局,控件将被放在窗体的东, 南,西,北,中部的位置. GridLayout(网格式布局)――窗体格局被划分为自定义的单元格. CardLayout(卡片式布局)――面板

.当一张 面板呈现在我们眼前时,窗体上其它的面板将被隐藏起来. 下面我们介绍一下我们常用的两种布局 BorderLayout 和 GridLayout 的用 法. 1. 5.1 下面是如何在面板中使用 BorderLayout 的例子: [例 3] import java.awt.*; import javax.swing.*; class Example1 extends JFrame{ Example1(){ this.setSize(300,200); this.setLocation(150,250); Container con=this.getContentPane(); JPanel p1=new JPanel(); con.add(p1); //容器加载面板 JTextField text=new JTextField(); JButton button=new JButton("ok"); p1.setLayout(new GridLayout(2,1)); //布局被设置为网格布 局,(2,1)表示两行一列 p1.add(text); //text 被加到面板(1,1)单元格中 p1.add(button); //text 被加到面板(2,1)单元格中 } public static void main(String args[]){ Example1 ex=new Example1(); ex.show(); } } 效果如下:
文本框
按钮
(图2) 这样我们就有了一个界面看起来比较整齐的窗体.如果我们想让按 钮变得再小一些,我们可以改成在(1,1)和(2,1)单元格中各放入 一个面板,在每个面板上使用流式布局添加按钮和文本框.或者我们可 以直接把 Container 的布局设置为 GridLayout (2,1),在 Container 的两个单元格中各加入一个面板. 修改代码如下: [例 4] import java.awt.*; import javax.swing.*; class Example1 extends JFrame{ Example1(){ this.setSize(300,200); this.setLocation(150,250); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1));//设置 Container 布局为 GridLayout JPanel p1=new JPanel(); //创建面板 1 JPanel p2=new JPanel(); //创建面板 2 con.add(p1); //面板 1 被放在(1,1) con.add(p2); //面板 2 放在(2,1) JLabel l1=new JLabel("请输入文字:"); //我们再增加一个标签 JTextField text=new JTextField(10); //设置文本能最大输入 10 个字 JButton button=new JButton("ok"); p1.add(l1); //面板 1 按默认布局放置标签和文本 框 p1.add(text); p2.add(button); } public static void main(String args[]){ Example1 ex=new Example1(); ex.show(); } } 修改后结果:
面板 1
面板 2 (图 2.1) ***注意*** 如果使用流式布局, 并且文本框加上标签的宽度超出了窗体的宽度,则标签 与文本框会变成上下排列.譬如我们把文本框最大输入改为 20 ,结果会变 成:
(图 2.2)
1. 5. 2 [例 5]
下面是如何在面板中使用 GridLayout 的例子:
Example1(){ this.setSize(300,200); this.setLocation(150,250); Container con=this.getContentPane(); JPanel p1=new JPanel(); JTextField t1=new JTextField(" JTextField t2=new JTextField(" JTextField t3=new JTextField("t3"); JTextField t4=new JTextField("t4"); JTextField t5=new JTextField(" p1.setLayout(new BorderLayout()); 边框式布局 p1.add(t1,BorderLayout.NORTH); p1.add(t2,BorderLayout.SOUTH); p1.add(t3,BorderLayout.EAST); p1.add(t4,BorderLayout.WEST); p1.add(t5,BorderLayout.CENTER); con.add(p1); }
t1"); t2");
t5"); //布局被设置为
效果如下:
NORTH
EAST
CEN
TH (图3) 使用了 BroderLayout 时,放在 CENTER 部位的控件会尽可能的得到窗体的 空间.而其他位置的控件会尽可能地变小(长).
WEST
2.有了上面知识的铺垫,我们先在可以来写一个简单的登录界面了. ********* *************************************************** 聊天程序代码: 实现部分:登陆界面 import java.awt.* ; import javax.swing.* ; public class wyClient extends JFrame { //可以把控件声明在外面,这样控件会拥有更高的被访问权 JTextField username ; JTextField password ; //声明文本框,用来输入用户名 //声明文本框,用来输入密码
wyClient() { this.setSize(300,200); this.setLocation(150,250); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); JPanel p1=new JPanel(); JPanel p2=new JPanel(); con.add(p1); con.add(p2); JLabel l1=new JLabel("用户名:"); JLabel l2=new JLabel("密 码:"); JTextField tusername=new JTextField(20); JTextField tpassword=new JTextField(20);
JButton bok=new JButton("ok"); JButton bcancel=new JButton("cancel"); p1.add(l1); p1.add(tusername); p1.add(l2); p1.add(tpassword); p2.add(bok); p2.add(bcancel); } public static void main(String args[]) { wyClient w = new wyClient() ; w.show() ; } } 运行结果如下:
//声明确认按钮 //声明取消按钮
Username 文本框 面板1
Password 文本框 面板2 (图4) 我们再来"画"一个用来发送聊天信息的窗体. **************** ************************************************** 聊天程序代码: 实现部分:登陆界面,主界面 import java.awt.*; import javax.swing.*; class wyMain extends JFrame { JTextField tsend; //在外部声明文本框,用来写留言 JComboBox clist; //声明下拉列表框,用来罗列在线用户 JTextArea ta; //声明大型文本区,用来显示聊天记录 wyMain(String title) { super(title); //访问父类 JFrame 的构造函数,为窗体实现标题 this.setSize(400,300); //窗体为 400 宽,300 高 this.setLocation(150,250); Container con=this.getContentPane(); con.setLayout(new BorderLayout()); //设置窗体布局为 BorderLayout JPanel pp=new JPanel();
JPanel p1=new JPanel(); JPanel p2=new JPanel(); ta=new JTextArea(); ta.disable();
//实例化大型文本区 //设置只读属性
pp.setLayout(new GridLayout(2,1)); //把 pp 设成[2,1]格式的网格布局 pp.add(p1); //在(1,1)单元格放 p1 pp.add(p2); //在(2,1)单元格放 p2 con.add(p,BorderLayout.NORTH); // Container 把 pp 放在窗体北边 con.add(ta,BorderLayout.CENTER); //Container 把文本区放在中间部位,让它能拥有足够的空间 JLabel l1=new JLabel("留言:"); JLabel l2=new JLabel("To:"); tsend=new JTextField(30); //实例化文本框 clist=new JComboBox(); //实例化下拉列表框 JButton bSend=new JButton("Send"); p1.add(l1); p1.add(tsend); p2.add(l2); p2.add(clist); p2.add(bSend); clist.addItem("所有人"); } } 我们现在有了一个叫做"主界面"的 java 类,我们给这个类加上主函数再运 行: public
main(String args[]){ wyMain wm=new wyMain("聊天窗口"); wm.show(); } 界面效果如下: //下拉列表框添加一项内容
(图 4.1)
3. 添加事件. 我们的聊天程序现在已经有了界面了,但是我们必须想法子让界面上的控件能 够实现它的具体功能,不然的话界面再漂亮也是毫无意义的.于是我们需要为 窗体定义一些事件. 3.1什么是事件? 窗体上任何东西都能成为事件源.事件就是描述事件源发生的变化的对 象.我们可以通过事件传来的信息去执行我们想要的事件响应. 譬如说:一个人的手臂被蚊子叮了一口,就触发了人被蚊子叮的事件,人 的身体(事件源)得到了被叮的消息,就从信息中辨别被叮的部位,然后伸手 去那个部位准确地把蚊子打死.我们叫打蚊子的动作为事件的响应. 3.2事件的类型:
3. 3 设立事件监听器:
拿上面的例子来说,人的皮肤就是负责监听事件传来消息的监听器 .在 java 中,事件监听器就是一个接口. 我们如果想让窗体对一种事件做出响应,我们就必须为窗体植上"皮 肤"—— 设立监听器. 3.4 如何注册窗体的事件以及如何设立监听器: 为了登录功能能够实现,我们现在在 wyClient 中设立按钮事件的监听 器. 步骤1 : 实现窗体事件监听器接口
(图5) 我们会见到下图所示的窗口:
单击这里
选择好要 实现接口 的类
(图6)
步骤2
:在图6的窗口中选择 java awt event,如下图:
(图7) 步骤3:如果我们要实现的事件是按钮事件,属于动作类事件 , 我们就再选择 ActionListener 实现"按钮事件监听".
(图 8) 按下"ok",这时我们会发现程序中发生了一些变化.
这表示我们的窗体类已经实现了 ActionListener 接口.再观察程序主函数的 下面.我们会发现多了一个方法.
(图 9) 填写事件响应代码
这个时候我们的事件监听就完成了吗?答案是:还没有.我们只是创造了 "皮肤",还必须把"皮肤"放到控件上面去.这样窗体才会通过"皮肤"来 "感应"到是哪个控件上发生了变化. 这时我们可以在方法 void actionPerformed(ActionEvent e)中加入事件发生 需要实现的代码.还记得前面介绍过的事件对象的种类吗?ActionEvent 是描 述按钮事件信息的对象.当按钮状态发生变化(比如 : 按下,弹起)时, 窗体就会自 动调用 action-Performed 方法 , 通过传进来的 ActionEvent 对象中携带的信息 判断发生变化的部位随后执行对事件作出的响应. 我们要让图 4 中的"Ok"按钮按下后,程序判断输入"用户名"文本框中 的口令是否正确,如果正确则显示出聊天主界面.为了窗体类之间能互相 调用, 我们把窗体类打包,在需要使用的时候调用. ********************************************************************* 聊天程序代码(登录部分): 实现部分:登录界面,登录事件 package huayu.qq; //在 wyMain
文件中也写同样打包语句 import java.awt.*; import javax.swing.*; import java.awt.event.ActionListener; import java.util.EventListener; import java.awt.event.ActionEvent; import huayu.qq.wyMain; //引入 wyMain 窗体类 public class wyClient extends JFrame implements ActionListener { JTextField tusername; JTextField tpassword; public wyClient(String title){ super(title); this.setSize(300,200); this.setLocation(150,250);
Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); JPanel p1=new JPanel(); JPanel p2=new JPanel(); con.add(p1); con.add(p2); JLabel l1=new JLabel("用户名:"); JLabel l2=new JLabel("密 码:"); tusername=new JTextField(20); tpassword=new JTextField(20); JButton bOk=new JButton("Ok"); JButton bCancel=new JButton("Cancel"); p1.add(l1); p1.add(tusername); p1.add(l2); p1.add(tpassword); p2.add(bOk); p2.add(bCancel); bOk.addActionListener(this); bCancel.addActionListener(this); } public static void main(String[] args){ wyClient w=new wyClient("登录窗口"); w.show(); } public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); //取得并且打印按钮的值 String uid=tusername.getText(); //取得输入的用户名 String pwd=tpassword.getText(); //取得输入的密码 if(e.getActionCommand().equals("Ok")) //判断按钮值是否为"ok" { if(uid.equals("Huayu")

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多