【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就行了。。。(防止代码被改烂。。)

posted @ 2017-04-27 15:50  xkfx  阅读(690)  评论(0)    收藏  举报