实验任务四:登录界面、实验任务五:猜数字
[实验任务四:登录界面]
程序设计思想:
首先是登录界面的布局,因为组件不是很整齐,没有使用固定的布局,主界面的setLayout()参数设为null,用setBounds()对各个组件标签、文本框、按钮等进行自由布局。验证码用按钮的形式显示便于每点击以此按钮会触发验证码的事件,进行随机转换,重新生成一个新的6位验证码。验证码是先生成0~2的数,0、1、2分别代表数字、小写字母、大写字母出现的一定概率,再用ASCII表的对应值的随机数产生字符,循环6次组合成字符串。用户名和验证码处的文本框直接读入,而密码处的文本框则为了保护密码的安全性,采用JPasswordField进行定义,使输进去的密码变为*。
登录按钮的触发事件,用户名不对则提示用户名不存在,密码不对则提示密码有误,验证码不对提示验证码有误,都正确则显示登陆成功,初始的用户名密码设成了自己的学号。快速注册也自动识别并提示注册成功。
程序流程图:
程序源代码:
1 package denglujiemian; 2 import java.awt.*; 3 import javax.swing.*; 4 import java.util.Random; 5 import java.awt.event.*; 6 public class Denglujiemian//定义Denglujiemian类 7 { 8 JFrame frame;//定义frame 9 JLabel label1=new JLabel("登录名:");//定义标签1 label1为“登录名” 10 JLabel label2=new JLabel("密码:");//定义标签2 label2为“密码” 11 JLabel label3=new JLabel("验证码:");//定义标签3 label3为“验证码” 12 JButton button1,button2,button3;//定义三个按钮分别为“登录”,“快速注册”,以及一个验证码按钮 13 JPanel panel1=new JPanel();//面板1 panel1 14 JPanel panel2=new JPanel();//面板2 panel2 15 JTextArea text1,text3;//定义文本框text1,text3 16 JPasswordField password=new JPasswordField();//定义密码文本框 17 String s="";//定义验证码按钮上的字符串 18 Random ran=new Random(); 19 String user_z,user_m; 20 public static void main(String[] args) //主函数 21 { 22 Denglujiemian p=new Denglujiemian();//Denglujiemian类的实例化 23 p.go();//对象p调用go函数 24 } 25 public void go()//定义go函数 26 { 27 frame=new JFrame("登录界面");//建立frame并命名为"登录界面" 28 text1=new JTextArea(20,100);//建立text1文本框并定义大小为20,100 29 password=new JPasswordField();//建立password密码文本框 30 text3=new JTextArea(20,100);//建立text3文本框并定义大小为20,100 31 button3=new JButton();//建立验证码按钮 32 button1=new JButton("登录");//建立登录按钮并定义为"登录" 33 button2=new JButton("快速注册");//建立快速注册按钮并定义为"快速注册" 34 for(int i=0;i<6;i++)//产生验证码,需循环6次 35 { 36 int x=ran.nextInt(3);//产生0~2三个中的随机数,分别对应数字,小写字母,大写字母 37 switch(x)//switch语句判断 38 { 39 case 0://x为0时 40 { 41 int q=ran.nextInt(10);//产生q为0~9的随机数 42 s=s+q;//验证码字符串加上一个 43 continue;//跳出switch小循环 44 } 45 case 1://x为1时 46 { 47 char w=(char) (ran.nextInt(26)+65);//产生q为65~91的随机数,并强制转换成ASCII表上的字符(小写字母) 48 s=s+w;//验证码字符串加上一个 49 continue;//跳出switch小循环 50 } 51 case 2://x为2时 52 { 53 char e=(char) (ran.nextInt(26)+97);//产生q为97~126的随机数,并强制转换成ASCII表上的字符(大写字母) 54 s=s+e;//验证码字符串加上一个 55 continue;//跳出switch小循环 56 } 57 } 58 } 59 Container contentPane=frame.getContentPane();//定义容器 60 contentPane.setLayout(null);//不设置固定的布局 61 contentPane.setBackground(Color.GRAY);//设置背景为灰色 62 //大容器里把所有组件都添加进去 63 contentPane.add(label1); 64 contentPane.add(label2); 65 contentPane.add(label3); 66 contentPane.add(text1); 67 contentPane.add(password); 68 contentPane.add(text3); 69 contentPane.add(button3); 70 contentPane.add(button1); 71 contentPane.add(button2); 72 //分别设置组件的位置和长宽 73 label1.setBounds(10,10,60,30); 74 label2.setBounds(10,40,60,30); 75 label3.setBounds(10,70,60,30); 76 text1.setBounds(70,15,200,20); 77 password.setBounds(70,45,200,20); 78 text3.setBounds(70,75,110,20); 79 button3.setBounds(185,75,85,20); 80 button1.setBounds(100,100,100,20); 81 button2.setBounds(100,130,100,20); 82 button3.setText(s);//将系统生成的6位验证码设置成验证码按钮的名称 83 frame.setSize(300,200);//设置面板的大小 84 frame.setResizable(false);//设置面板大小不可修改 85 frame.setVisible(true);//显示面板 86 button3.addActionListener(new ActionListener()//验证码按钮使用匿名类添加事件 87 { 88 public void actionPerformed(ActionEvent e)//ActionListener接口中的函数重写 89 { 90 s="";//定义空字符串 91 for(int i=0;i<6;i++)//产生验证码,需循环6次 92 { 93 int x=ran.nextInt(3);//产生0~2三个中的随机数,分别对应数字,小写字母,大写字母 94 switch(x)//switch语句判断 95 { 96 case 0://x为0时 97 { 98 int q=ran.nextInt(10);//产生q为0~9的随机数 99 s=s+q;//验证码字符串加上一个 100 continue;//跳出switch小循环 101 } 102 case 1://x为1时 103 { 104 char w=(char) (ran.nextInt(26)+65);//产生q为65~91的随机数,并强制转换成ASCII表上的字符(小写字母) 105 s=s+w;//验证码字符串加上一个 106 continue;//跳出switch小循环 107 } 108 case 2://x为2时 109 { 110 char g=(char) (ran.nextInt(26)+97);//产生q为97~126的随机数,并强制转换成ASCII表上的字符(大写字母) 111 s=s+g;//验证码字符串加上一个 112 continue;//跳出switch小循环 113 } 114 } 115 } 116 button3.setText(s);//字符串s设置为验证码按钮的名称 117 } 118 }); 119 button1.addActionListener(new ActionListener()//登录按钮使用匿名类添加事件 120 { 121 public void actionPerformed(ActionEvent e)//ActionListener接口中的函数重写 122 { 123 String s1=text1.getText();//得到登录名处的文本框的内容 124 char[] p=password.getPassword(); 125 String s2=new String(p);//得到密码处的文本框的内容 126 String s3=text3.getText();//得到验证码处的文本框的内容 if((s1.equals("20163493")&&s2.equals("20163493")&&s3.equals(s))|| (s1.equals(user_z)&&s2.equals(user_m)&&s3.equals(s)))//判断字符串是否相等 127 JOptionPane.showMessageDialog(frame,"登录成功!","登录信息",JOptionPane.PLAIN_MESSAGE);//如果登录名密码验证码都正确,弹出登录成功 128 else if((s1.equals("20163493")&&!s2.equals("20163493"))||(s1.equals(user_z)&&!s2.equals(user_m)))//判断字符串是否相等 129 JOptionPane.showMessageDialog(frame,"用户名或密码有误!","登录信息",JOptionPane.ERROR_MESSAGE);//如果登录名验证码都正确,密码不正确,弹出用户名或密码有误 130 else if((!s1.equals("20163493"))&&(!s1.equals(user_z)))//判断字符串是否相等 131 JOptionPane.showMessageDialog(frame,"该用户名不存在!","登录信息",JOptionPane.ERROR_MESSAGE);//如果登录名不正确,弹出该用户名不存在 132 else if((s1.equals("20163493")&&s2.equals("20163493")&&!s3.equals(s))||(s1.equals(user_z)&&s2.equals(user_m)&&!s3.equals(s)))//判断字符串是否相等 133 JOptionPane.showMessageDialog(frame,"验证码错误!","登录信息",JOptionPane.ERROR_MESSAGE);//如果登录名密码都正确,验证码不正确,弹出验证码错误 134 } 135 }); 136 button2.addActionListener(new ActionListener()//快速注册按钮使用匿名类添加事件 137 { 138 public void actionPerformed(ActionEvent e)//ActionListener接口中的函数重写 139 { 140 user_z=text1.getText();//得到登录名处的文本框的内容 141 char[] p=password.getPassword(); 142 user_m=new String(p);//得到密码处的文本框的内容 143 JOptionPane.showMessageDialog(frame,"注册成功!","注册信息",JOptionPane.PLAIN_MESSAGE);//读入登录名密码验证码,弹出注册成功 144 } 145 }); 146 } 147 }
实现结果截图:
实验总结:
对于实现不同功能的按钮来说,使用匿名类的方式添加事件比较方便,不易出现错误。
[实验任务五:猜数字]
程序设计思想:
当程序开始执行时,系统自动生成一个1~100的随机整数。引用do while语句使用户循环输入一个猜测的数值,将其由字符串类型转换成整型数值并与系统生成数进行判断。如果大于,则弹出消息框提示“猜大了!”,否则,则弹出消息框提示“猜小了!”。
循环此操作直到用户猜的数值和系统生成数相等,跳出循环,弹出消息框提示猜到正确数值,程序退出。
程序流程图:
程序源代码:
1 package caishuzi; 2 3 import java.util.Random; 4 5 import javax.swing.*; 6 7 public class Caishuzi//定义Caishuzi类 8 9 { 10 public static void main(String[] args)//主函数 11 { 12 String s;//定义s为要输入的猜测数值 13 int d;//定义d为字符串s转换为的整型数值 14 Random random=new Random();//随机数 15 int t=random.nextInt(100)%(100)+1;//生成t为1~100的随机整数 16 do//do while循环语句输入并判断 17 { 18 s=JOptionPane.showInputDialog( "请输入您猜测的数值:" );//弹出消息框,进行猜测数值的输入 19 d=Integer.parseInt(s);//字符串s转化为整型数值d 20 if(d>t)//如果猜测数值大于系统随机数 21 JOptionPane.showMessageDialog(null,"猜大了!", 22 "Results",JOptionPane.PLAIN_MESSAGE );//弹出消息框提示“猜大了” 23 else if(d<t)//如果猜测数值小于系统随机数 24 JOptionPane.showMessageDialog(null,"猜小了!", 25 "Results",JOptionPane.PLAIN_MESSAGE );//弹出消息框提示“猜小了” 26 } 27 while(d!=t);//满足循环的条件 28 JOptionPane.showMessageDialog(null,"恭喜,正确猜出数字!"+t, 29 "Results",JOptionPane.PLAIN_MESSAGE );//弹出消息框提示猜出正确数字 30 } 31 }
运行结果截图:
编译错误分析:
无编译错误出现