需求分析:

逐步完善一个“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就行了。。。(防止代码被改烂。。)

【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. 蓝桥杯 第三届C/C++预赛真题(1) 微生物增值(数学题)

    假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y. 现在已知有新 ...

  2. uva 10494 - If We Were a Child Again 大数除法和取余

    uva 10494 - If We Were a Child Again If We Were a Child Again Input: standard inputOutput: standard ...

  3. RedMine Email notifications configure for MS Exchange

    Boss需要用到RedMine(project management) open source. 由于不熟悉MS的SMTP服务,BOSS说他配好了,然后配置到Email notification时候, ...

  4. ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...

  5. ExtJs4学习(六)MVC中的Model

    Model定义的两种方式 第一种 Ext.define("User",{ extend:"Ext.data.Model", fields:[{ name:'us ...

  6. IEnumerable 与 Iqueryable 的区别

    IEnumerable 和 IQueryable   共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable&l ...

  7. Selenium Firefox 官方Webdriver -- Geckodriver 下载地址

    Selenium Firefox 官方Webdriver -- Geckodriver 下载地址 https://github.com/mozilla/geckodriver/releases

  8. Decorate设计模式

    定义:装饰器设计模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.不改变对象的情况下,动态增加其功能. • 需要扩展一个类的功能,或给一个类添加附加的成员. • 需要动态地给一个对象增 ...

  9. IOS And WCF 上传文件

    IOS And WCF Story 研究IOS上传到WCF图片的小功能,WCF实现服务端的文件上传的例子很多,单独实现IOS发送图片的例子也很多,但是两个结合起来的就很少了. 可以通过base64来上 ...

  10. Extjs combobox 实现搜索框的效果

    目的:使用combobox实现一个类似搜索框的效果,即用户输入内容后,出现相关下列列表,提供选择. 实现:extjs3 中combobox自身带这个功能即在remote模式下,store在load的时 ...