[笔记] Java基础(11)-GUI与网络

200 阅读4分钟

1. Frame类

  • Frame类:java.awt.Frame
  • Frame(String title):新建一个不可见的窗体,标题为title
  • void setSize(int width, int height):设置窗口的大小
  • void setLocation(int x, int y):设置窗口的位置
  • void setIconImage(Image image):设置窗口的图标
    • Image image = Toolkit.getDefaultToolkit().createImage("xx/xx.jpg");
  • void setVisible(boolean b):设置是否可见
  • Component add(Component comp):添加组建到窗口中

2. 布局管理器

  • frame.setLayout(LayoutManager mgr):设置布局管理器,如:new FlowLayout()
  • FlowLayout:流式布局;从左到右
  • BorderLayout:边界布局;东南西北中
  • GridLayout:网格布局;规则矩阵
  • GridBagLayout:网格包布局;非规则矩阵
  • CardLayout:卡片布局;选项卡

3. 窗体监听

  • frame.addWindowListener(WindowListener listener):添加窗体监听
  • WindowListener接口:java.awt.event.WindowListener
  • void windowActivated(WindowEvent e):活动时调用
  • void windowClosed(WindowEvent e):关闭时调用
  • void windowClosing(WindowEvent e):从系统菜单中关闭时调用
  • void windowDeactivated(WindowEvent e):非活动窗口时调用
  • void windowDeiconfied(WindowEvent e):最小化变为正常时调用
  • void windowIconfied(WindowEvent e):正常变为最小化时调用
  • void windowOpened(WindowEvent e):首次变为可见时调用
  • WindowAdapter类实现了WindowListener接口,可以避免重写多余的方法

4. 鼠标监听

  • component.addMouseListener(MouseListener listener):添加鼠标监听
  • MouseListener接口:java.awt.event.MouseListener
  • void mouseClicked(MouseEvent e):鼠标单击时调用
  • void mouseEntered(MouseEvent e):鼠标进入时调用
  • void mouseExited(MouseEvent e):鼠标移开时调用
  • void mousePressed(MouseEvent e):鼠标按下时调用
  • void mouseReleased(MouseEvent e):鼠标释放时调用
  • MouseAdapter类实现了MouseListener接口,可以避免重写多余的方法

5. 键盘监听

  • component.addKeyListener(KeyListener listener):添加键盘监听
  • KeyListener接口:java.awt.event.KeyListener
  • void keyPressed(KeyEvent e):按键按下时调用
  • void keyReleased(KeyEvent e):按键释放时调用
  • void keyTyped(KeyEvent e):键入某个键时调用
  • 可通过传入的KeyEvent对象的getKeyCode()方法获取按键码,判断是哪个按键按下
  • KeyEvent类中每个按键都有一个对应的常量值
  • KeyAdapter类实现了KeyListener接口,可以避免重写多余的方法

6. 动作监听

  • component.addActionListener(ActionListener listener):添加动作监听
  • ActionListener接口:java.awt.event.ActionListener
  • void actionPerformed(ActionEvent e):鼠标点击或按下空格时调用,类似视频暂停功能

7. 相关术语

  • 事件:用户的操作,包含鼠标、键盘等操作
  • 事件源:被操作的组件
  • 监听器:实现监听器接口的类,被添加到事件源上后,事件发生时虚拟机就会自动调用监听器中的事件处理方法

8. UDP传输

  • UDP协议不区分客户端和服务端

  • 发送

    String str = "hello!";
    /* 创建DatagramSocket对象,端口号可以为随机 */
    DatagramSocket socket = new DatagramSocket();
    /* 创建DatagramPacket对象,指定数据、长度、目标地址、端口 */
    DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes.length, InetAddress.getByName("127.0.0.1"), 6666);
    /* 使用DatagramSocket对象发送DatagramPacket对象 */
    socket.send(packet);
    /* 关闭DatagramSocket */
    socket.close();
    
  • 接收

    /* 创建DatagramSocket对象,指定接收端口 */
    DatagramSocket socket = new DatagramSocket(6666);
    /* 创建DatagramPacket对象,指定数组与长度 */
    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
    /* 使用DatagramSocket对象接收DatagramPacket */
    socket.receive(packet);
    /* 从DatagramPacket对象中获取数据 */
    byte[] arr = packet.getData();
    int len = packet.getLength();
    String str = new String(arr, 0, len);
    /* 关闭DatagramSocket */
    socket.close();
    

9. TCP传输

  • TCP协议区分客户端和服务端

  • 客户端

    /* 创建Socket对象连接服务端,需要指定IP与端口号 */
    Socket socket = new Socket("127.0.0.1", 1234);
    /* 调用Socket对象的getInputStream与getOutputStream方法,获取与服务端相连的IO流 */
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
    /* 使用输出流写数据到服务端的输入流 */
    out.write("hello world".geteBytes());
    /* 使用输入流读取服务端输出流的数据 */
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String result = new String(buf, 0, len);
    /* 关闭Socket,会将InputStream与OutputStream一起关闭 */
    socket.close();
    
  • 服务端

    /* 创建ServerSocket对象,需要指定端口号 */
    ServerSocket server = new ServerSocket(1234);
    /* 调用ServerSocket的accpt方法接收一个客户端的请求,得到一个Socket;accpt方法在没有请求时阻塞 */
    Socket socket = server.accpt();
    /* 调用Socket对象的getInputStream与getOutputStream方法,获取与客户端相连的IO流 */
    InputStreawm in = socket.getInputStreawm();
    OutputStreawm out = socket.getOutputStream();
    /* 使用输出流写数据到客户端的输入流 */
    out.write("service: welcome!".getBytes());
    byte[] buf = new byte[1024];
    /* 使用输入流读取客户端输出流的数据 */
    int len = in.read(buf);
    String result = new String(buf, 0, len);
    /* 关闭Socket,会将InputStream与OutputStream一起关闭 */
    socket.close();
    /* 关闭ServerSocket,即关闭服务,不再响应请求,故一般不关闭 */
    server.close();