黑马程序员18——GUI、网络编程

来源:互联网 发布:ubuntu tty1 编辑:程序博客网 时间:2024/05/21 13:57

------- android培训、java培训、期待与您交流! ----------


8 Gui编程

  awt  : 抽象的工具窗口,重量级框架,依赖操作系统
  Swing:基于awt,轻量级框架,不依赖操作系统


  awt做出的界面,界面的效果,跟随操作系统走
  Swing做出的界面,界面效果,不会跟系统的改变而改变


9. Frame类制作一个窗口
  构造方法
  空参数,带有标题的,(String)


  setVisible(true)
  设置窗口的参数,大小,位置
  setBounds(int x ,int y,int width,int height)
  设置背景色
  setBackground(Color r)
  Color类,构造方法,传递int r,g,b
  new Color(0-255,0-255,0-255);


  知道屏幕分辨率,通过程序获取分辨率
  Toolkit类,静态方法 getDefaultToolKit获取对象
  通过类的非静态方法 getScreenSize获取屏幕大小
  获取类的对象Dimension,静态常量获取到屏幕分辨率




10. 布局管理器
  演示,将组件,添加到窗体中


  Button类,创建按钮使用的
  Button(String label) 参数显示在,按钮上


  将组件放在窗体上,用的是窗体的方法add()
  setBounds对按钮位置和尺寸,定义,但是无效
  窗体的布局管理发挥作用


  取消布局管理器
  调用窗体的方法 setLayout(布局管理器对象,接口的实现类) null
  什么布局管理也不使用


  添加文本框,用户的输入
  TextField 单行文本组件,可以输入,编辑
  构造方法,空参数,空空文本框

  new TextField("哈哈哈"),框里面就会显示 哈哈哈


1. 事件监听

  用户操作图形界面上的组件,产生很多的功能
  事件监听器,监听用户的一切操作


  事件源:按钮,用户可以操作的部分,事件源
  事件:鼠标事件,键盘事件,窗体
  监听器:负责监视用户的一举一动,只要用户有动作,就会被监听器捕获到
  事件处理:用户点击了一个事件源,鼠标,监听器收到了用户的动作,调用一个方法,实现功能,换行,开机
  
  软件上的按钮W,换行,事件源,用户鼠标点击按钮,鼠标事件,只要点了,按钮后面的监听器就识别,调用方法实现换行


  有一个人,事件源
  事件,挨揍事件
  监听器,等着挨揍
  处理方式




  如果你打了这个事件源,挨揍事件产生了,监听器收到了挨揍这个事件,调用方法
  处理这个挨揍后的结果,如果轻了,忍了,重了,去医院
  
  实现一个关闭的效果:
    事件源,窗体:
    窗体Frame父类,方法addWindowListener,添加一个窗体的事件监听
    public void addWindowListener(WindowListener l)
    传递一个WindowListener接口的实现类对象
    定义接口的实现类,重写抽象方法
    需要实现的方法中,写实际应该代码


  事件监听器的代码,最终,有适配器类Adapter和自己的匿名内部类就实现了功能


  规律,日后写事件监听器写法
  事件源.addXXXListener(new XXXAdapter(){
      重写你需要的方法
      public void XXXX(XXXEvent e){
          具体的功能实现
      }
  });


2. 鼠标事件
  通过按钮,实现鼠标的事件
  点击,单击,多击
  鼠标悬停,鼠标离开


   MouseEvent类,方法
   int getClickCount()获取鼠标点击的次数


3. 键盘事件
  通过文本框,实现键盘事件
  按下的是哪一个键,使用组合键Ctrl+Enter


  keyPressed(KeyEvent e) 键盘按下
  KeyEvent类,封装了很多静态常量,将键盘上的所有键的ASCII码,做成了静态常量
  看看键的码,不需要知道具体的数字,知道键的名字就可以
   int getKeyCode() 键的ASCII码值
   char getKeyChar()键的实际内容
   KeyEvent 父类方法consume(),阻止事件的产生
   KeyEvent 父类方法,isAltDown  isControlDown


4. AWT实现功能
 用户输入一个目录,点击按钮,或者按下回车
 展示这个目录下的全部内容


5. 菜单
 制作菜单,需要找封装好的类,完成菜单的制作
 MenuBar类,完成整体的菜单栏
    构造方法,只有一个空参数的


 Menu类,菜单 文件,编辑,查看
    菜单,构造方法,带有一个String的,直接将文字写在菜单上
 MenuItem类,菜单的功能
    菜单条目,构造方法,带有一个String的,直接将文字写在菜单上


 点击菜单有功能,事件,写在Item上
 对于菜单,JDK提供了一个事件,活动事件,点击了菜单,按下回车键,事件就会响应


 子菜单,将一个Menu添加到另一个Menu,就是子菜单


6. 记事本
  FileDialog对话框,getDirectory() 返回String,获取到选择的路径
  getFile() 返回String,获取到文件名


7. IP地址
  对于每一个接入互联网的主机,在互联网上都有一个唯一的身份标识
  标识IP地址 1.3.1.1
  四个数字段组成,每个段0-255
  每段不同,进行了分类 ABCDE


  本地回环地址:每个主机,都有一个回环地址,只要你的物理设备是OK,网卡
  127.0.0.1 本机IP地址  相当于自己在叫自己的名字
  localhost
  192.168 开头表示局域网
  IP地址,这个事物,Java也把它对象的封装,提高更多的方法操作IP地址
  java.net.InetAddress类,IP地址的对象封装类
  InetAddress不提高构造方法,私有了,不能new
  提高了很多的非静态方法
  找静态方法,返回本类的对象


  static InetAddress getLocalHost() 返回本地主机IP地址对象,方法在哪个机器上运行的
  返回IP地址,主机名


  String getHostAddress() 返回IP地址,String类型
  String getHostName() 返回主机名 String类型


  static InetAddress getByName(String host) 返回的IP地址对象,是传递的主机名决定的


8. 端口号
  一个程序开启后,占用的Windows的物理标识
  0-65535可以用, 0-1024被占用
  一个端口号,只能有一个程序占用
  21号,FTP上传服务器文件
  80号,浏览器访问网站的端口号
  1433号,微软的数据库访问端口号
  1521号,Oralce数据库访问端口号
  3306号,MySQL数据库访问端口号
  8080号,JavaWeb服务器端口号


9. 通信协议
 通信协议:通信两点,之间约定好的内容
 今天晚上12点,我给你打电话,打你的137开头的手机,说韩语


 UDP:
   将发送内容,目的地,封装在数据包中
   不需要连接,面向无连接协议
   数据限制在64KB以内
   不可靠协议
   速度很快
 
10. Socket服务
  要求通信的两端,必须有Socket服务
  负责数据的收与发
  UDP中,谁是这个协议的Socket服务呢
  DatagramSocket
  DatagramPacket


11. UDP的数据发送端
  实现步骤:
    A.数据封装成数据包,有你发的数据,和目的地(IP)
      DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
                       字节数组 , 数组长度    IP地址对象          接收的端口号


    B.建立Socket服务
      DatagramSocket() 发送数据的


    C.数据包,交给Socket服务进行投递
       void send(DatagramPacket p) 
 
    D.关闭资源


12. UDP的接收端
 实现步骤:
  A. 建立数据包对象,没有目的了
      DatagramPacket(byte[] buf, int length) 


  B. 建立Socket服务,接收数据包
      DatagramSocket(int port) 创建Socket服务,int==端口号,告诉Widnows,打开端口号
      void receive(DatagramPacket p) 
  C. 拆包
      字节数组
  D. 数据,IP
      获取到字节数组中的有效个数
      数据包方法 int getLength() 获取数组有效字节个数
      数据包方法InetAddress getAddress() 返回发送的主机的IP对象
      数据包方法int getPort() 返回发送方法发数据,出去Windows端口号
  E. 关闭资源




  发送端,键盘输入的方式,发送,转换流读取键盘的输入
     自定义结束标记
  接收端,不能停止的接收(死循环),不能关闭资源




  一个控制台,同时实现接收和发送,类似于飞秋
  多线程的聊天程序

package cn.itcast.nets;/* * 多线程的聊天程序 * main中,创建Socket服务,一个接收,一个发送 * 传递给2个线程 */import java.io.*;import java.net.*;class SendThread implements Runnable{private DatagramSocket ds ;SendThread(DatagramSocket ds){this.ds = ds;}public void run(){BufferedReader bfr = null;try{bfr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = bfr.readLine())!=null){byte[] bytes = line.getBytes();DatagramPacket dp = new DatagramPacket(bytes, bytes.length,InetAddress.getByName("192.168.3.100"),8000);ds.send(dp);if("886".equals(line))break;}}catch(Exception e){throw new RuntimeException("发送失败");}finally{try{if(bfr!=null)bfr.close();}catch(Exception e){}finally{ds.close();}}}}//定义多线程的接收端class ReceiveThread implements Runnable{private DatagramSocket ds;ReceiveThread(DatagramSocket ds) {this.ds = ds;}public void run(){byte[] bytes = new byte[1024];try{while(true){//数组放在数据包中,准备接收DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);//字节数组有效个数int length = dp.getLength();//获取发送IP对象。IP地址String ip = dp.getAddress().getHostAddress();//获取端口号,发送int port = dp.getPort();String message = new String(bytes,0,length);if("886".equals(message))System.out.println(ip+"..."+port+"...走了");elseSystem.out.println(message + "..."+ip+"..."+port);}}catch(Exception e){}}}public class ChatDemo {public static void main(String[] args) throws Exception{//创建2个Socket对象,发送,接收的DatagramSocket send = new DatagramSocket(9000);DatagramSocket receive = new DatagramSocket(8000);new Thread(new SendThread(send)).start();new Thread(new ReceiveThread(receive)).start();}}


0 0
原创粉丝点击