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