1. 程式人生 > >JAVA實現簡單的登入介面

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();
			}
	}
}

大致上就是這樣,新人第一次編寫,如有錯誤,請各位大佬指正,謝謝。