IM项目进程(一)

IM需求

今天我们开始了IM项目的开发,以此作为我们近阶段学习的一次综合性的实践。

项目需求如下:

由于之前SVN项目我是负责项目后台逻辑处理,于是这次我想尝试前台UI设计。在经过今晚近三个多小时的奋斗,我也查漏补缺了不少知识点,在此总结一下:

知识点总结

1.

//去掉窗口装饰
this.setUndecorated(true);

2.

JComboBox jcb = new JComboBox();
jcb.setEditable(true);
jcb.setBounds(new Rectangle(260, 75, 240, 35));

这是JComboBox

getSelectedItem()

setSelectedItem(String str)

3.

JLabel jl3 = new JLabel("注册");
		jl3.setBounds(new Rectangle(100, 188, 190, 35));
		jl3.setFont(new Font("Dialog", 1, 15));
		jl3.setForeground(Color.blue);

4.

设置窗口最小化

setState(Frame.ICONIFIED);

设置程序关闭

System.exit(0);

用于自定义最小化和关闭按钮,DIY是件很酷的事情哦!

5.

		// 将图片加载到JLabel上
		JLabel label_background = new JLabel(new ImageIcon("image/2.jpg"));
		label_background.setBounds(0, 0, this.getWidth(), this.getHeight());
		// 相当于将JLabel贴在第二层面板的底层
		this.getLayeredPane().add(label_background, new Integer(Integer.MIN_VALUE));
		// JComponent是JPanel的父类,用于拿到窗口的第一层面板
		JComponent jc = (JComponent) this.getContentPane();
		// 设置第一层面板透明化
		jc.setOpaque(false);

源代码分享

view包结构

这是我的view包的结构,其中chat是聊天界面类,listener是监听器类,main是主窗口类,也就是类似QQ的好友列表窗口,start是一开始的登录和注册界面。(希望能学到更规范的命名方法)

StartFrame

package view.start;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import view.listener.MyActionListener;
import view.listener.MyMouseAdapter;

public class StartFrame extends JFrame {
	public static StartFrame sf;

	public static void main(String[] args) {
		sf = new StartFrame();
	}

	public StartFrame() {
		initStartFrame();
	}

	private void initStartFrame() {
		this.setSize(550, 280);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		this.setLayout(null);
		this.setDefaultCloseOperation(3);
		// 去掉窗口装饰
		this.setUndecorated(true);

		JLabel jl1 = new JLabel("用户名");
		jl1.setBounds(new Rectangle(200, 65, 50, 50));

		JComboBox jcb = new JComboBox();
		jcb.setEditable(true);
		jcb.setBounds(new Rectangle(260, 75, 240, 35));

		JLabel jl2 = new JLabel("密     码");
		jl2.setBounds(new Rectangle(200, 120, 50, 50));

		JPasswordField jpf = new JPasswordField(18);
		jpf.setBounds(new Rectangle(260, 130, 240, 35));

		JButton jb1 = new JButton("登录");
		jb1.setBounds(new Rectangle(260, 187, 240, 35));

		JLabel jl3 = new JLabel("注册");
		jl3.setBounds(new Rectangle(100, 188, 190, 35));
		jl3.setFont(new Font("Dialog", 1, 15));
		jl3.setForeground(Color.blue);
		MyMouseAdapter mma = new MyMouseAdapter(jcb, jpf);
		jl3.addMouseListener(mma);

		// 添加图片
		JPanel jp = new JPanel();
		jp.setBounds(new Rectangle(70, 75, 88, 88));
		jp.setBackground(Color.white);

		// 缩小按钮
		JButton button_narrow = new JButton("narrow");
		button_narrow.setBounds(new Rectangle(450, 0, 50, 35));

		// 关闭按钮
		JButton button_close = new JButton("close");
		button_close.setBounds(new Rectangle(500, 0, 50, 35));

		MyActionListener mal = new MyActionListener(jcb, jpf);
		jb1.addActionListener(mal);
		button_close.addActionListener(mal);
		button_narrow.addActionListener(mal);

		// 将图片加载到JLabel上
		JLabel label_background = new JLabel(new ImageIcon("image/2.jpg"));
		label_background.setBounds(0, 0, this.getWidth(), this.getHeight());
		// 相当于将JLabel贴在第二层面板的底层
		this.getLayeredPane().add(label_background, new Integer(Integer.MIN_VALUE));
		// JComponent是JPanel的父类,用于拿到窗口的第一层面板
		JComponent jc = (JComponent) this.getContentPane();
		// 设置第一层面板透明化
		jc.setOpaque(false);

		this.add(button_narrow);
		this.add(button_close);
		this.add(jp);
		this.add(jl1);
		this.add(jcb);
		this.add(jl2);
		this.add(jpf);
		this.add(jb1);
		this.add(jl3);

		this.setVisible(true);
	}
}

MyActionListener

package view.listener;

import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import view.start.StartFrame;

public class MyActionListener implements ActionListener {
	private JComboBox jcb;
	private JPasswordField jpf;

	public MyActionListener(JComboBox jcb, JPasswordField jpf) {
		this.jcb = jcb;
		this.jpf = jpf;
	}

	public void actionPerformed(ActionEvent e) {
		JButton jb = (JButton) e.getSource();
		String type = jb.getText();
		// 获得用户名和密码
		String name = (String) jcb.getSelectedItem();
		String psd = jpf.getText();
		switch (type) {
		case "登录":
			// TODO 登录操作
			System.out.println("login" + name + psd);
//			StartFrame.sf.setVisible(false);
			break;
		case"narrow":
			StartFrame.sf.setState(Frame.ICONIFIED);
			break;
		case"close":
			System.exit(0);
			break;
		}
		jcb.setSelectedItem("");
		jpf.setText("");
	}

}

MyMouseListener

package view.listener;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComboBox;
import javax.swing.JPasswordField;

import view.start.StartFrame;

public class MyMouseAdapter extends MouseAdapter {
	private JComboBox jcb;
	private JPasswordField jpf;

	public MyMouseAdapter(JComboBox jcb, JPasswordField jpf) {
		this.jcb = jcb;
		this.jpf = jpf;
	}

	public void mouseClicked(MouseEvent e) {
		// 获得用户名和密码
		String name = (String) jcb.getSelectedItem();
		String psd = jpf.getText();
		// TODO 注册操作
		System.out.println("register" + name + psd);
		// StartFrame.sf.setVisible(false);
	}
}

运行结果(登录和注册界面)

自我感觉

界面还是个雏形,肯定需要更进一步的完善(swing原配太丑了。。。)随着项目的推进,最后希望能够呈现一个比较好的效果,今晚出了做这个界面,还有复习了以前的一些知识点。三个小时如白马过隙,总算明白程序员为什么总是熬夜,原来是代码敲着敲着,兴趣来了,停不下来了吧。(听说大多数情况是为了赶项目。。。我毕竟太年轻。。。)

时间: 2025-01-05 19:51:20

IM项目进程(一)的相关文章

搭建项目进程记录

今天是搭建这个项目的第三天 搭建这个项目 1.用pods 先把AFNetworking这个库和处理图片的库导入了进来 2.整体用的是  外面的一层Nav->Tab控制器加Nav这样的,虽然这样看起来很奇怪,因为主流的框架只是里面的那一层,没办法,碰到了白痴的美工,让我这样搭就这样搭吧 2015年9月18碰到的问题 1.怎样使得图片选中不变灰,我记得自己操作过这个,只是忘记了.需要回头复习一下 2.用约束做的左边的额第一个界面,为什么要么不显示,要么居中,很奇怪

小组项目进程展示

1.项目名称:闲置物品交换系统 2.小组成员:刘方东,姚昕怡,梅敏敏,刘昊昕,马骁驰,李炬坪 3.小组项目已实现功能:查看所有物品(查看物品所有者),删除个人已上传物品,修改个人信息,修改待审核物品,上传物品(图片,描述).物品审核. 4.小组项目待实现功能:帮助,物品分类,界面美化. 5.遇到的问题:微信小程序审核不通过 6.小程序展示: 7.审核界面展示 原文地址:https://www.cnblogs.com/mmm3/p/9126351.html

pm2命令管理启动的nodejs项目进程

安装 npm install -g pm2 用法 $ npm install pm2 -g # 命令行安装 pm2 $ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js # 也可以把'max' 参数传递给 start # 正确的进程数目依赖于Cpu的核心数目 $ pm2 start app.js --name my-api # 命名进程 $ pm2 list # 显示所有进程状态 $ pm2 monit # 监视所有进程 $ pm2 logs # 显示所有进程日

分析“词频统计“项目进程

目录 功能需求 代码实现 psp 功能需求 1.小文件输入 2.支持命令行输入英文作品的文件名 3.支持命令行输入存储有英文作品文件的目录名,批量统计 4从控制台读入英文单篇作品 代码实现 本次代码实现了功能3. 类名 功能 void main(String[]) 主函数,调用其他函数实现基本功能 void SortMap(Map<String ,Integer>) 对Map进行排序 void Outputlist(Scanner) 对所给目录下文档进行统计并输出 void wordcont(

龙之森林项目进程

龙之森林是一款桌游的电子版本,尝试着实现这款游戏,主要是源于我对于策略游戏的喜爱,还有希望通过写一些unity3D游戏来加深自己对于unity3D的理解.龙之森林的相关信息可以在龙之森林作者的主页里找到,作者也设计了其它一些其它类型的桌游,有兴趣的话可以去他的主页逛逛或者联系下他本人.通过浏览龙之森林作者的主页,以及与他的几次简单交流,让我觉得他是一个富有创造力的人,一个相当有才的人,与这样的人交流,总能使自己得到进步,这恰好是沉浸于程式以后愈来愈死板及腐朽的自己所缺少的,或许这也是我决定实现这

产品经理在外包项目时如何踩更少的坑

说起这个经历,还是挺难忘.背景还是上家公司(名字问题,误以为是另外一家公司,发现同事不错,就没走了.),刚开始自己没有技术组,外包出去的项目,接手的时候那套系统,唉,真破.BUG不断,错漏百出. 好了,开始接触外包公司了.交接给我的时候可好说话了,艾玛哥哥就屁颠屁颠的花了两三天弄了个PRD给他们,后来周四给他们,额,人家不接受你的AXURE原型和文档.后来他们丢了一套自己的文档.也就是这PPT格式的PRD=.= 其实,也知道他们是在拖工期(因为之前就在外包公司呆过,罪过罪过~),当时就提议换掉或

项目经理的磨练(2) 科学的安排项目日程安排

1. 自上向下式 这种方式是指,从项目的整体时间或者重大的里程碑来倒推各项子任务时间,用各项子任务的完成来支撑整个项目的整理时间.这种方式适用于,对项目完成时间要求很严格的项目,项目团队从结束时间开始倒退,划分重要的大里程碑时间,再在大里程碑中,划分小里程碑,任务包,小任务包.最底层的任务越小,估算越准确. 这种方式可能存在的问题是,如果老板说了这个项目6月1日要完成,但是说到小任务算下来,发现根本不够时间完成.做为项目经理的你打算怎么办?后面的故事应该会对你有所启发. 请记住这个时候千万不要想

为什么你的安全数据湖项目会失败

真搞不懂,一些团队由于某些原因居然认为他们可以建立一个安全数据湖和/或他们自己的大数据安全分析工具.让我来告诉你们会发生什么--失败. 提示一下数据沼泽笑话.想想数据浮渣.讨论一下在数据池里撒尿.结果是一样的--不会成功. 好吧,让我缓和一点来说说--0.1%的人将会成功(即使这种成功只是一定程度上的).(这个百分比是近似值,不是为了提供数据,意在增加这个"职位"戏剧性的影响.) 为什么我会对此如此坚持呢?在我们的UEBA研究期间,我们遇到了几个正在从DIY/定制安全分析迁移到COTS

团队作业8——第二次项目冲刺(Beta阶段)--第四天

一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 17% 201421123002 翁珊 18% 201421123004 黄美海 15% 201421123008 刘伟霞 15% 201421123013 张家豪 20% 201421123018 李福镪 15% 四.困难与问题 1.type 属性等于"email"而不是"text".新 HTML 输入类型在某种程度上适用于每个单独浏览器