JAVA實現簡單的登入介面
我本來是學C++的,然後課程上老師要求做一個登陸介面,用C++實現不限時,然後就選擇了JAVA,從零開始自學JAVA。好在網上很多大佬都寫了如何用JAVA編寫登陸介面的部落格,寫得很詳細,使得我第一次接觸JAVA也能看懂一二。
比較推薦這篇,博主真的很細心,我主要也是參考的這篇文章(分為一、二兩篇):
參考了眾多文章之後,我終於達到了自己的目標,實現了一個簡單的登入介面,功能包括:正常登入(只能登入設定好的賬號和密碼)、賬號密碼錯誤提示、錯誤三次提示鎖定(僅僅是提示,鎖定沒做)。下面講講怎麼實現吧。
程式分為兩個部分,登入介面和登入後轉跳的介面。
首先是登入介面:
首先是awt:
import java.awt.Dimension; //封裝了一個構件的高度和寬度
import java.awt.FlowLayout; //流式佈局,解決元件相互覆蓋問題
import java.awt.Font; //字型
然後是swing,也就是我們做視窗需要的元件:
import javax.swing.JFrame; //窗體容器元件類(屬於頂級容器) import javax.swing.JLabel; //標籤 import javax.swing.JTextField; //文字輸入框元素元件類 import javax.swing.JPasswordField; //密碼輸入框元件類 import javax.swing.JButton; //按鍵元件類
我們的思路是,定義一個初始化介面函式,在main函式中呼叫。這裡初始化函式我命名為initUI。在函式中我們需要對窗體和各部分元件進行定義。
首先是窗體,需要定義的屬性有:窗體的標題、窗體的大小、窗體的關閉方式、窗體的顯示位置、字型、流式佈局、是否能夠修改窗體大小以及窗體是否可見。
然後是各元件,各元件的設定都大同小異,主要是顯示內容、大小、字型,最重要的一步是要把元件新增到窗體上去。詳情請看程式碼和註釋。
package test; import java.awt.Dimension; //封裝了一個構件的高度和寬度 import java.awt.FlowLayout; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JPasswordField; import javax.swing.JButton; public class Login { //在類中定義主函式 public static void main(String[] args) { // TODO Auto-generated method stub //在主函式中,例項化Login類的物件,呼叫初始化介面的方法 Login login = new Login(); login.initUI(); } //在類中定義初始化介面的方法 public void initUI() { //在initUI中例項化JFrame類的物件 JFrame frame = new JFrame(); //設定窗體物件的屬性值 frame.setTitle("Login");//設定窗體標題 frame.setSize(400, 250);//設定窗體大小,只對頂層容器生效 frame.setDefaultCloseOperation(3);//設定窗體關閉操作,3表示關閉窗體退出程式 frame.setLocationRelativeTo(null);//設定窗體相對於另一組間的居中位置,引數null表示窗體相對於螢幕的中央位置 frame.setResizable(false);//禁止調整窗體大小 frame.setFont(new Font("宋體",Font.PLAIN,14));//設定字型,顯示格式正常,大小 //例項化FlowLayout流式佈局類的物件,指定對齊方式為居中對齊元件之間的間隔為10個畫素 FlowLayout fl = new FlowLayout(FlowLayout.CENTER,10,10); //例項化流式佈局類的物件 frame.setLayout(fl); //例項化JLabel標籤物件,該物件顯示“賬號” JLabel labname = new JLabel("賬號:"); labname.setFont(new Font("宋體",Font.PLAIN,14)); //將labname標籤新增到窗體上 frame.add(labname); //例項化JTextField標籤物件化 JTextField text_name = new JTextField(); Dimension dim1 = new Dimension(300,30); text_name.setPreferredSize(dim1);//設定除頂級容器元件以外其他元件的大小 //將textName標籤新增到窗體上 frame.add(text_name); //例項化JLabel標籤物件,該物件顯示“密碼” JLabel labpass = new JLabel("密碼:"); labpass.setFont(new Font("宋體",Font.PLAIN,14)); //將labpass新增到窗體上 frame.add(labpass); //例項化JPasswordField JPasswordField text_password = new JPasswordField(); //設定大小 text_password.setPreferredSize(dim1); //新增到窗體 frame.add(text_password); //例項化JButton元件 JButton button1 = new JButton(); //設定按鍵的顯示內容 Dimension dim2 = new Dimension(100,30); button1.setText("登入"); button1.setFont(new Font("宋體",Font.PLAIN,14)); //設定按鍵大小 button1.setSize(dim2); frame.add(button1); frame.setVisible(true);//窗體可見,一定要放在所有元件加入窗體後 LoginListener ll = new LoginListener(frame,text_name,text_password); button1.addActionListener(ll); } }
介面實現的結果如下:
接下來是第二部分,也就是按鍵監聽。
我們在輸入賬號密碼後,如果賬號密碼匹配,則顯示登入成功的介面,否則顯示賬號或密碼錯誤,並提示剩餘次數。當剩餘次數用盡後,會顯示賬號已鎖定(但是並沒有實現鎖定功能),同時關閉視窗。
整體思路如下:
1.首先對登入按鍵設定監聽,判斷是否被按下。
2.若被按下,則獲取賬號和密碼輸入框內的內容,並用if語句進行判斷,同時新建一個窗體備用。
3.若賬號密碼匹配,則在新建窗體上建立標籤顯示登入成功;如果不匹配,則判斷剩餘次數,剩餘次數大於0的時候顯示還可輸入的次數,並有返回登入介面的按鍵(這裡注意,我們的登入介面不能先關閉);剩餘次數為0,則顯示賬號鎖定,以及關閉窗體的按鍵。
還是按順序來,首先是awt:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Font;
跟登入介面的大同小異,主要增加了監聽的軟體包。
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
接下來是元件,增加了JPanel,這是一個容器,把其他元件加入到它裡面然後再對它進行排版。為什麼要增加這個元件呢?因為我在做這個部分的時候遇到了一個問題,就是我在一個窗口裡同時添加了一個標籤和一個按鍵,但是展示結果卻是按鍵填充了整個視窗介面,標籤被按鍵覆蓋,調整了按鍵大小也沒有作用,最後查得可以使用JPanel這個元件來解決元件之間相互覆蓋的問題。
下面是程式碼,窗體建立部分跟上個部分大同小異,關鍵在於文字框內容的獲取、賬號密碼的匹配、監聽的設定和監聽後的操作。
package test;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class LoginListener implements ActionListener{
private javax.swing.JTextField text_name;
private javax.swing.JPasswordField text_password;
private javax.swing.JFrame login;
public LoginListener(javax.swing.JFrame login,javax.swing.JTextField text_name,javax.swing.JPasswordField text_password)
{//獲取登入介面、賬號密碼輸入框物件
this.login=login;
this.text_name=text_name;
this.text_password=text_password;
}
int i=3;//3次登入機會
public void actionPerformed(ActionEvent e)
{
Dimension dim2 = new Dimension(100,30);
Dimension dim3 = new Dimension(300,30);
//生成新介面
javax.swing.JFrame login2 = new javax.swing.JFrame();
login2.setSize(400,200);
login2.setDefaultCloseOperation(3);
login2.setLocationRelativeTo(null);
login2.setFont(new Font("宋體",Font.PLAIN,14)); //宋體,正常風格,14號字型
//建立元件
javax.swing.JPanel jp1 = new JPanel();
javax.swing.JPanel jp2 = new JPanel();
if(text_name.getText().equals("vv") && text_password.getText().equals("123456"))
{
JLabel message = new JLabel("登陸成功!");
message.setFont(new Font("宋體",Font.PLAIN,14)); //宋體,正常風格,14號字型
message.setPreferredSize(dim3);
jp1.add(message);
login2.add(jp1,BorderLayout.CENTER);
login2.setResizable(false);
login2.setVisible(true);
//通過我們獲取的登入介面物件,用dispose方法關閉它
login.dispose();
}
else if(i>=2)
{
JLabel message = new JLabel("賬號或密碼錯誤,您今天還有"+(i-1)+"次機會");
message.setFont(new Font("宋體",Font.PLAIN,14)); //宋體,正常風格,14號字型
message.setPreferredSize(dim3);
//將textName標籤新增到窗體上
jp1.add(message);
login2.add(jp1,BorderLayout.CENTER);
JButton close = new JButton("確定");
close.setFont(new Font("宋體",Font.PLAIN,14));
//設定按鍵大小
close.setSize(dim3);
jp2.add(close);
login2.add(jp2,BorderLayout.SOUTH);
i--;//次數減少
close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
login2.dispose();
}
});
login2.setResizable(false);
login2.setVisible(true);
}
else if(i == 1)
{
JLabel message = new JLabel("賬號已鎖定,請明天再試");
message.setFont(new Font("宋體",Font.PLAIN,14)); //宋體,正常風格,14號字型
message.setPreferredSize(dim3);
//將textName標籤新增到窗體上
jp1.add(message);
login2.add(jp1,BorderLayout.CENTER);
JButton close = new JButton("確定");
close.setFont(new Font("宋體",Font.PLAIN,14));
//設定按鍵大小
close.setSize(dim3);
jp2.add(close);
login2.add(jp2,BorderLayout.SOUTH);
close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
login2.dispose();
}
});
login2.setResizable(false);
login2.setVisible(true);
//通過我們獲取的登入介面物件,用dispose方法關閉它
login.dispose();
}
}
}
大致上就是這樣,新人第一次編寫,如有錯誤,請各位大佬指正,謝謝。