• 【Java】仿真qq尝试:聊天界面 && 响应用户输入


    需求分析:

    逐步完善一个“qq仿真”程序。

    参考:

    1、文本框与文本区:http://www.weixueyuan.net/view/6062.html

    2、java布局:http://www.cnblogs.com/hthuang/p/3460234.html

    效果:

    login界面:

    主界面:

    思路:

    1、先完成“精简”的本地版本

    2、考虑与服务器交互

    3、逐步完善功能

    代码:

    窗体大小方案一:

            // 取得屏幕的尺寸
            Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            int screenWidth = screenSize.width;
            int screenHeight = screenSize.height;
    
            // 设置窗体尺寸、位置
            setSize(screenWidth/6, screenHeight/6);
            setLocationRelativeTo(null); // 居中

     QQLogin:

    package com.xkfx.qq.ui;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class QQLogin extends JFrame implements ActionListener {
        private static final int DEFAULT_WIDTH = 300;
        private static final int DEFAULT_HEIGHT = 200;
    
        private JButton btnLogin = new JButton("Sign in");
        private JButton btnRegister = new JButton("Sign up");
    
        private JLabel labUsername = new JLabel("Username");
        private JLabel labPassword = new JLabel("Password");
        private JTextField txtUsername = new JTextField();
        private JTextField txtPassword = new JTextField();
    
        private void setComponents() {
            // 组件1
            JPanel panUser = new JPanel();
            panUser.setLayout(new GridLayout(2, 2));
    
            panUser.add(labUsername);
            panUser.add(txtUsername);
            panUser.add(labPassword);
            panUser.add(txtPassword);
    
            // 组件2
            JPanel panBtn = new JPanel();
            panBtn.setLayout(new FlowLayout());
    
            panBtn.add(btnLogin);
            panBtn.add(btnRegister);
    
            // 组合
            setLayout(new BorderLayout());
    
            add(panUser, BorderLayout.CENTER);
            add(panBtn, BorderLayout.SOUTH);
        }
    
        private void listenComponents() {
            btnLogin.addActionListener(this);
            btnRegister.addActionListener(this);
        }
    
        public QQLogin() {
            // 设置窗体大小和位置
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            setResizable(false);
            setLocationRelativeTo(null); // 居中
    
            // 设置组件
            setComponents();
    
            // 设置监听组件
            listenComponents();
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Sign in")) {
                System.out.println("用户点击了登陆");
            }
    
            if (e.getActionCommand().equals("Sign up")) {
                System.out.println("用户点击了注册");
            }
        }
        // 其实这里不需要暴露actionPerformed方法,但是无法设置成private。。。
    }
    
    class QQLoginTest {
        public static void main(String[] args) {
            // 暂时简单地把这里看作启动Swing程序的神器代码
            EventQueue.invokeLater(() -> {
                JFrame frame = new QQLogin();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 关闭窗体就结束程序。默认情况下,当关闭窗体时只是把窗体“隐藏”起来。
                frame.setVisible(true);
            });
        }
    }

     QQMain:

    package com.xkfx.qq.ui;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class QQMain extends JFrame implements ActionListener {
        private static final int DEFAULT_WIDTH = 400;
        private static final int DEFAULT_HEIGHT = 400;
    
        private JTextField txtMessage = new JTextField();
        private JComboBox cmbUser = new JComboBox();
        private JButton btnSend = new JButton("Send");
    
        private JTextArea txtArea = new JTextArea();
        private JScrollPane spArea = new JScrollPane(txtArea);
    
        //(参考书)
        private void setComponents() {
            // 组件1
            JPanel panSmall = new JPanel();
            panSmall.setLayout(new GridLayout(1, 2));
    
            panSmall.add(cmbUser);
            panSmall.add(btnSend);
    
            // 组件2
            JPanel panBig = new JPanel();
            panBig.setLayout(new GridLayout(2, 1));
    
            panBig.add(txtMessage);
            panBig.add(panSmall);
    
            // 组合
            setLayout(new BorderLayout());
    
            add(txtArea, BorderLayout.CENTER);
            add(panBig, BorderLayout.NORTH);
        }
    
        private void listenComponents() {
            btnSend.addActionListener(this);
        }
    
        public QQMain() {
            // 设置窗体大小和位置
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            setResizable(false);
            setLocationRelativeTo(null); // 居中
    
            // 设置组件
            setComponents();
    
            // 设置监听组件
            listenComponents();
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Send")) {
                System.out.println("用户点击了发送");
            }
        }
    }
    
    class QQMainTest {
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                JFrame frame = new QQMain();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            });
        }
    }

     后续 & 补充:

    1、用blog来管理代码多少有点不方便。。。因为代码是不断修改的。。。等到一定规模考虑搬到github上去。。。

    2、用git管理本地代码。根据个人经验,小量的本地代码只需要用到:git init、git add --all、git commit -m "words"、git reflog、git reset --hard hashcode就行了。。。(防止代码被改烂。。)

  • 相关阅读:
    如何方便的下载youtube视频?
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    用opencv+python全屏进行显示图片
    58. Length of Last Word
    numpy的resize和reshape区别
    Opencv的绘图
    Python的slice问题
    jqgrid一次性加载
  • 原文地址:https://www.cnblogs.com/xkxf/p/6774273.html
Copyright © 2020-2023  润新知