今天给喜欢Java的朋友们推荐一款集成开发环境
平时打代码,做普通项目,我一般用的就是IDEA
但是如果要做图形用户界面(GUI),给大家推荐NetBeans
如果需要安装包,请在文章下评论,或者关注我,然后直接私信我
右边有控件、容器、菜单…,你想做什么样的,直接从右边拖出来即可
非常的方便
现在来做一个用户登录注册玩玩
给大家先看看,我随便做的一个成果
如果您的用户名和密码正确,点击登录后,先会弹框显示登录成功,必须点确定,其他地方不能点,点确定后,会进入,我自己随便做的一个模拟四则运算的简单计算器
这里面所有界面的小图标,都是我自己改的,待会给你们说怎么改
这里,要知道,除数不能为0,如果您选择除号后,点击计算,会弹框提示
再给大家看看注册界面,其实和登录界面差不多
然后可以自己定义用户名和密码的规则,然后如果用户注册时,没满足点击注册,会给玩家提示出规则
差不多就这些了,有很多细节,我在下面给大家说一下,现在展示完了,给大家说说我思路和分析
这就是我的src中分包和Java文件
1.用户操作接口包 cn.itcast.dao(UserDao.java也是一个接口)
2.用户类操作包 cn.itcast.dao.impl
(UserDaoImpl.java就是UserDao接口的实现类)
3.用户类基本描述类包 cn.itcast.pojo (User.java是一个用户类)
4.资源包 cn.itcast.resource
(里面放了两张图片,我在百度截图的,用于修改窗体的图标)
5.界面效果包 cn.itcast.util (UiUtil.java是一个专门做界面效果的类)
6.视图包 cn.itcast.view
a:LoginFrame.java是登录界面,
b:NewJFrame.java是模拟四则运算简单计算器
c:RegistFrame.java是注册界面
我们现在开始内容填充:
1.用户类(cn.itcast.pojo 包下的User.java)
( 这没啥讲的,就只有成员变量,构造方法,成员方法getXxx()/setXxx() )
代码如下:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.itcast.pojo;
/**
*
* @author Lenovo
*/
public class User {
private String username; //用户名
private String password; //密码
public User(){
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
}
2.用户操作接口(cn.itcast.dao 包下的UserDao.java)
(用户的操作,当然不能定义成一个类,会有很多的操作,所以我觉得是一个接口,最好的是,每一个不同的操作都定义成一个接口,任何用户,需要用什么操作,就实现什么接口,Java里面只能单继承,可以多实现,但是登陆和注册,是每一个用户都拥有的操作,所以两个操作我定义在一个接口中,有用户登录功能和用户注册功能)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.itcast.dao;
import cn.itcast.pojo.User;
/**
*
* @author Lenovo
*/
public interface UserDao {
/**
* 这是用户登录功能
* @param username 用户名
* @param password 密码
* @return 登录是否成功
*/
public abstract boolean login(String username,String password);
/**
* 这是用户注册功能
* @param user 被注册的用户信息
*/
public abstract void regist(User user);
}
3.用户操作类(cn.itcast.dao.impl 包下的cn.itcast.dao.impl)
(这是上面那个接口的实现类,肯定要重写接口中的用户登录和注册两个抽象方法)
用户注册:我们还是用的IO流,因为不会有图片,都是可读懂的,所以选择用高效字符输出流(写入文件user.txt),写入的时候我们我们选择 用户名+“=”+密码 这种方式存储到文件中,这样更方便我们判断用户名和密码是否匹配,一定要记得释放资源,要把bw.colse()方法放在finally里面
用户登录:我也也用的IO流,用的高效字符输入流(读取文件user.txt),读取数据的时候选择每次读取一行数据,再用String类中public String[] split(String regex)方法来分割字符串
String[] datas = line.split("=");这样就把用户名和密码分别存入datas字符串数组中下标为0和1中,再用equals方法,判断用户登录输入用户名和密码是否匹配,如果都匹配成功,则返回true,然后break,如果匹配不成功,再循环,直到读取到字符串为null,则退出循环,返回false.
注意:
(1)文件要在类加载时就自动创建,防止,玩家先登录,则没有文件,会报错
(2)写入文件时,要追加写入,不然每一次注册,都重新创建一个新的user.txt
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.itcast.dao.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.pojo.User;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Lenovo
*/
public class UserDaoImpl implements UserDao{
//定义文件
private static File file = new File("user.txt");
//类加载的时候就把文件创建
static {
try {
file.createNewFile();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public boolean login(String username, String password) {
boolean flag=false;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while((line=br.readLine()) != null){
String[] datas = line.split("=");
if(datas[0].equals(username)&&datas[1].equals(password)){
flag=true;
break;
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}finally{
try {
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return flag;
}
@Override
public void regist(User user) {
BufferedWriter bw = null;
try {
bw=new BufferedWriter(new FileWriter("user.txt",true));
bw.write(user.getUsername()+"="+user.getPassword());
bw.newLine(); //换行
bw.flush(); //刷新
} catch (IOException ex) {
ex.printStackTrace();
}finally{
try {
bw.close(); //释放资源
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
4.界面效果包 cn.itcast.util (UiUtil.java是一个专门做界面效果的类)
这里要把UiUtil构造方法私有化,防止外界通过构造创建对象,调用方法,所以我们要把里面的方法都为静态,可以直接用类名调用
对界面做效果,一般都会用到工具类(Toolkit类)
//获取工具类对象
//public static Toolkit getDefaultToolkit():获取默认工具包
通过上面的Toolkit类中的静态方法就可以获取工具类的对象
(1)修改窗体图标
JFrame类
public void setIconImage(Image image)
设置要作为此窗口图标显示的图像。
image对象通过下面方法返回:
Toolkit类中的方法,通过上面教的创建对象,调用方法
public abstract Image getImage(String filename)返回一幅图像,该图像从指定文件中获取像素数据,图像格式可以是 GIF、JPEG 或 PNG。
(2)设置窗体居中
/*
思路:
A:获取屏幕的宽和高
B:获取窗体的宽和高
C:(用屏幕的高-窗体的高)/2,(用屏幕的高-窗体的高)/2作为窗体的新坐标
*/
获取屏幕的宽和高,当然就要用Toolkit的对象调用getScreenSize()方法
获取窗体的宽和高,用JFrame的对象调用getWidth(),getHeight()方法
设置窗体的新坐标,用JFrame的对象调用setLocation()方法
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.itcast.util;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
/**
* 专门做界面效果的类
*
* @author Lenovo
*/
public class UiUtil {
private UiUtil() {
}
//修改窗体的图标
public static void setFrameImage(JFrame jf) {
//获取工具类对象
//public static Toolkit getDefaultToolkit():获取默认工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//根据路径获取图片
Image i = tk.getImage("src\\cn\\itcast\\resource\\P8K7U9~SLY5A{52BLGYDW]T.png");
//给窗体设置图片
jf.setIconImage(i);
}
//修改窗体的图标
public static void setFrameImage(JFrame jf,String imageName) {
//获取工具类对象
//public static Toolkit getDefaultToolkit():获取默认工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//根据路径获取图片
Image i = tk.getImage("src\\cn\\itcast\\resource\\"+imageName);
//给窗体设置图片
jf.setIconImage(i);
}
//设置窗体居中
public static void setFrameConter(JFrame jf) {
/*
思路:
A:获取屏幕的宽和高
B:获取窗体的宽和高
C:(用屏幕的高-窗体的高)/2,(用屏幕的高-窗体的高)/2作为窗体的新坐标
*/
//获取工具对象
Toolkit tk = Toolkit.getDefaultToolkit();
//获取屏幕的宽和高
Dimension d = tk.getScreenSize();
double srceenWidth = d.getWidth();
double srceenHeigh = d.getHeight();
//获取窗体的宽和高
int frameWidth = jf.getWidth();
int frameHeigh = jf.getHeight();
//获取新的宽和高
int width = (int) (srceenWidth - frameWidth) / 2;
int heigh = (int) (srceenHeigh - frameHeigh) / 2;
//设置窗体的新坐标
jf.setLocation(width, heigh);
}
}
5.视图
a:LoginFrame.java是登录界面,
b:NewJFrame.java是模拟四则运算简单计算器
c:RegistFrame.java是注册界面
这三个我给你们讲一个,但是三个的源代码和视图我都会给你们,因为基本都一样,你们如果认真看了我说的,并且想了,就一定都懂了,那我讲一个最难的登录界面吧,
上图是登录的设计图(上面)
这些所有控件都可以编辑文本,更改变量名称
编辑文本就是展示给用户看的,更改变量名称就是我们在源代码中,用这些变量就this.名称就是,如果不需要用的东西,就可以不用更改变量名称,例如用户名和密码两个标签。
用户名和密码都是标签,用户名后面的白色用户可以输入的框框,是文本字段,密码后面的白色用户可以输入的框框,是口令字段,输入密码就不会显示出来。
登录,重置,注册,就是按钮,是可以绑定事件的,意思玩家一点击,就可以进行你绑定的事件
现在我们进入源代码分析
我们需要在该类中定义一个私有方法(设置标题,设置此窗体是否可由用户调整大小,设置窗体居中,修改窗体图标),然后在该类的无参构造中,实现此私有方法,意思一启动,就设置窗体属性
然后现在需要做的就是,对每一个按钮,来进行事件绑定
(1)登录按钮
既然是登录,我们就要校验用户名和密码是否匹配
/*
思路:
A:获取用户名和密码
B:正则表达式校验用户名和密码
C:创建对象调用功能,返回一个boolean值
D:根据boolean值给出提示
*/
思路上面,在源代码里面,我思路写的很清楚,可以认真看看,一定能看懂
(2)重置按钮
既然是重置,我们就要清空用户名和密码中的东西,再获取光标
(3)注册按钮
让注册的视图可见,关闭登录的视图
现在我给你们登录的源码(下面)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.itcast.view;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.util.UiUtil;
import javax.swing.JOptionPane;
/**
*
* @author Lenovo
*/
public class LoginFrame extends javax.swing.JFrame {
/**
* Creates new form LoginFrame
*/
public LoginFrame() {
initComponents();
init();
}
private void init(){
//this指的是该类的对象,该类继承JFrame
this.setTitle("登录界面"); //设置标题
this.setResizable(false); //设置此窗体是否可由用户调整大小
UiUtil.setFrameConter(this