[實驗任務四:登入介面]
程式設計思想:
首先是登入介面的佈局,因為元件不是很整齊,沒有使用固定的佈局,主介面的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 }
執行結果截圖:
編譯錯誤分析:
無編譯錯誤出現