需求分析:

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

参考:

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

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

效果:

login界面:

主界面:

思路:

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

2、考虑与服务器交互

3、逐步完善功能

代码:

窗体大小方案一:

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

QQLogin:

  1. package com.xkfx.qq.ui;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7.  
  8. public class QQLogin extends JFrame implements ActionListener {
  9. private static final int DEFAULT_WIDTH = 300;
  10. private static final int DEFAULT_HEIGHT = 200;
  11.  
  12. private JButton btnLogin = new JButton("Sign in");
  13. private JButton btnRegister = new JButton("Sign up");
  14.  
  15. private JLabel labUsername = new JLabel("Username");
  16. private JLabel labPassword = new JLabel("Password");
  17. private JTextField txtUsername = new JTextField();
  18. private JTextField txtPassword = new JTextField();
  19.  
  20. private void setComponents() {
  21. // 组件1
  22. JPanel panUser = new JPanel();
  23. panUser.setLayout(new GridLayout(2, 2));
  24.  
  25. panUser.add(labUsername);
  26. panUser.add(txtUsername);
  27. panUser.add(labPassword);
  28. panUser.add(txtPassword);
  29.  
  30. // 组件2
  31. JPanel panBtn = new JPanel();
  32. panBtn.setLayout(new FlowLayout());
  33.  
  34. panBtn.add(btnLogin);
  35. panBtn.add(btnRegister);
  36.  
  37. // 组合
  38. setLayout(new BorderLayout());
  39.  
  40. add(panUser, BorderLayout.CENTER);
  41. add(panBtn, BorderLayout.SOUTH);
  42. }
  43.  
  44. private void listenComponents() {
  45. btnLogin.addActionListener(this);
  46. btnRegister.addActionListener(this);
  47. }
  48.  
  49. public QQLogin() {
  50. // 设置窗体大小和位置
  51. setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  52. setResizable(false);
  53. setLocationRelativeTo(null); // 居中
  54.  
  55. // 设置组件
  56. setComponents();
  57.  
  58. // 设置监听组件
  59. listenComponents();
  60. }
  61.  
  62. @Override
  63. public void actionPerformed(ActionEvent e) {
  64. if (e.getActionCommand().equals("Sign in")) {
  65. System.out.println("用户点击了登陆");
  66. }
  67.  
  68. if (e.getActionCommand().equals("Sign up")) {
  69. System.out.println("用户点击了注册");
  70. }
  71. }
  72. // 其实这里不需要暴露actionPerformed方法,但是无法设置成private。。。
  73. }
  74.  
  75. class QQLoginTest {
  76. public static void main(String[] args) {
  77. // 暂时简单地把这里看作启动Swing程序的神器代码
  78. EventQueue.invokeLater(() -> {
  79. JFrame frame = new QQLogin();
  80. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  81. // 关闭窗体就结束程序。默认情况下,当关闭窗体时只是把窗体“隐藏”起来。
  82. frame.setVisible(true);
  83. });
  84. }
  85. }

QQMain:

  1. package com.xkfx.qq.ui;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7.  
  8. public class QQMain extends JFrame implements ActionListener {
  9. private static final int DEFAULT_WIDTH = 400;
  10. private static final int DEFAULT_HEIGHT = 400;
  11.  
  12. private JTextField txtMessage = new JTextField();
  13. private JComboBox cmbUser = new JComboBox();
  14. private JButton btnSend = new JButton("Send");
  15.  
  16. private JTextArea txtArea = new JTextArea();
  17. private JScrollPane spArea = new JScrollPane(txtArea);
  18.  
  19. //(参考书)
  20. private void setComponents() {
  21. // 组件1
  22. JPanel panSmall = new JPanel();
  23. panSmall.setLayout(new GridLayout(1, 2));
  24.  
  25. panSmall.add(cmbUser);
  26. panSmall.add(btnSend);
  27.  
  28. // 组件2
  29. JPanel panBig = new JPanel();
  30. panBig.setLayout(new GridLayout(2, 1));
  31.  
  32. panBig.add(txtMessage);
  33. panBig.add(panSmall);
  34.  
  35. // 组合
  36. setLayout(new BorderLayout());
  37.  
  38. add(txtArea, BorderLayout.CENTER);
  39. add(panBig, BorderLayout.NORTH);
  40. }
  41.  
  42. private void listenComponents() {
  43. btnSend.addActionListener(this);
  44. }
  45.  
  46. public QQMain() {
  47. // 设置窗体大小和位置
  48. setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  49. setResizable(false);
  50. setLocationRelativeTo(null); // 居中
  51.  
  52. // 设置组件
  53. setComponents();
  54.  
  55. // 设置监听组件
  56. listenComponents();
  57. }
  58.  
  59. @Override
  60. public void actionPerformed(ActionEvent e) {
  61. if (e.getActionCommand().equals("Send")) {
  62. System.out.println("用户点击了发送");
  63. }
  64. }
  65. }
  66.  
  67. class QQMainTest {
  68. public static void main(String[] args) {
  69. EventQueue.invokeLater(() -> {
  70. JFrame frame = new QQMain();
  71. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  72. frame.setVisible(true);
  73. });
  74. }
  75. }

后续 & 补充:

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

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

【Java】仿真qq尝试:聊天界面 && 响应用户输入的更多相关文章

  1. 微信小程序开发系列五:微信小程序中如何响应用户输入事件

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  2. Java基础之使用Scanner类获取用户输入

    创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanne ...

  3. android 仿QQ气泡聊天界面

    1.现在的QQ,微信等一些APP的聊天界面都是气泡聊天界面,左边是接收到的消息,右边是发送的消息, 这个效果其实就是一个ListView在加载它的Item的时候,分别用了不同的布局xml文件. 2.效 ...

  4. Java入门:基础算法之获取用户输入

    本部分演示如何获取用户输入.我们使用Scanner类来得到用户输入.下面的实例代码中演示了如何获取用户输入的字符串.整数和float数据.主要用到了以下方法: 1)public String next ...

  5. 【Java】仿真qq尝试:用户注册(三)

    需求: 实现用户名和密码存入数据库. 思路: 1.连接数据表用静态加载块 2.crud写成4个静态方法 具体流程: from:https://www.tutorialspoint.com/jdbc/j ...

  6. 【Java】仿真qq尝试:用户注册(二)

    参考: 1.corejavaI:使用解耦的try/catch与try/finally 2.Java中try catch finally语句中含有return语句的执行情况(总结版):http://bl ...

  7. 【Java】仿真qq尝试:用户注册(一)

    需求: 1.流程分析:客户端程序拿到用户名和密码,将用户名和密码发送到服务端(在客户端验证合法性),服务端接收并存储用户名和密码,返回给客户端一个信息(可能是成功也可能是失败.) 2.数据怎么存?服务 ...

  8. safari 浏览器 input textarea select 等不能响应用户输入

    解决办法 -webkit-user-select:auto; /*webkit浏览器*/ user-select:auto; -o-user-select:auto; -ms-user-select: ...

  9. QQ聊天界面的布局和设计(IOS篇)-第二季

    QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...

随机推荐

  1. 细节取胜的javadoc

    今个以为开发经验丰富的同事提出有个改动有问题,希望改一下.老前辈发话,心虚的紧,立即看了下,问题说是我的方法凝视中写了一个 ** doesn't ** 建议改为 does not 说这个生成javad ...

  2. HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)

    题目地址:HDU 4970 先进行预处理.在每一个炮塔的火力范围边界标记一个点. 然后对每一个点的伤害值扫一遍就能算出来. 然后在算出每一个点到终点的总伤害值,并保存下来,也是扫一遍就可以. 最后在询 ...

  3. Social Network 社交网络分析

    Social Network 社交网络分析 一:什么是SNA-社交网络分析 社交网络分析的威力何在?我想几个案例来说明. 案例1:对一个毫无了解的组织(这个组织可以是一个公司,亦或是一个组织),如果能 ...

  4. AderTemplate

    http://www.cnblogs.com/kwklover/archive/2007/07/12/815509.html 概述 AderTemplate是一个小型的模板引擎.无论是拿来直接使用还是 ...

  5. 3D游戏引擎〇 開始

    游戏循环: 初始化:运行一些主要的初始化操作,如内存分配,资源获取.从磁盘载入数据等. 进入游戏循环:进入主游戏循环.用户不断地运行动作,知道退出主循环为止. 读取玩家输入:处理玩家输入,或将其存储到 ...

  6. iOS-UIScrollView拉伸效果

    解决办法: 比如登录界面是可以上下拉伸的(微信),在ScrollView里调用一下这个方法即可. scrollView.alwaysBounceVertical = YES;

  7. 网站速度优化模块HttpCompressionModule

    为了优化网站的访问速度,准备采用HttpCompressionModule 6对传输数据进行压缩,下载了HttpCompressionModule 6 , 并按照示例程序中的web.config配置了 ...

  8. Null value was assigned to a property of primitive type setter

    org.springframework.orm.jpa.JpaSystemException: Null value was assigned to a property of primitive t ...

  9. jCarousel.js 插件

    轮播图 中间放大 内容跟着切换 (参考 米趣 网站) html   <div class="jcarousel-wrapper"> <div class=&quo ...

  10. 170227、java分布式系统开关功能设计(服务升降级)

    首先讲一下开关的由来,例如东京在6月18日做店庆促销活动,在交易下单环节,可能需要调用A.B.C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时 ...