天天看點

我的Java學習之路(二):簡談JFrame界面開發與事件監聽機制

本次我将對JFrame的界面開發做簡略講解,同時引申出如何安裝監聽器,在點選某按鈕後顯示新的界面。

(一)制作一個簡單的JFrame界面

我們以制作一個仿QQ登入界面為例,成果如下圖:

我的Java學習之路(二):簡談JFrame界面開發與事件監聽機制

首先,我們來考慮一下制作一個此界面需要的元件:

架構、文字(文字标簽)、複選框、圖檔(圖檔标簽)、文字編輯框、密碼編輯框、登入按鈕。

同時布局方式我們采用最簡單的流式布局(即排滿了一行再去排下一行)。

我們需要引用API文檔中相應的包名以實作這些元件,即:

import javax.swing.JFrame;//窗體
import java.awt.FlowLayout;//流式布局
import javax.swing.ImageIcon;//圖檔
import javax.swing.JTextField;//文字編輯框
import javax.swing.JPasswordField;//密碼編輯框
import java.awt.Dimension;//編輯框、按鈕尺寸
import javax.swing.JLabel;//标簽
import javax.swing.JButton;//按鈕
import javax.swing.JCheckBox;//複選框
           

準備工作就緒,接下來開始建立一個符合我們想法的窗體以及進行流式布局的安排,代碼如下:

public class login(){
   public void show()
	{
		JFrame loginJFrame = new JFrame();
		//建立窗體類
		loginJFrame.setSize(400,420);
		loginJFrame.setTitle("QQ");
		loginJFrame.setLocationRelativeTo(null);
		loginJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//窗體參數及特性(尺寸、名稱、居中、程式關閉)
		
		FlowLayout layout = new FlowLayout();
		loginJFrame.setLayout(layout);
		//建立流式布局
           

值得一提的是,尺寸設定要在居中前,否則起不到居中的效果。

接下來,我們要往上面添加相應的元件。

我們需要為每個元件建立相應的對象,注意每次添加要引用

loginJFrame.add(元件對象名);

同時,還有一點要值得注意:圖檔是不能直接添加到窗體上的,需要先将圖檔添加到圖檔标簽上,再将圖檔标簽添加到窗體上。

代碼如下:

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信圖檔_20190616173720.png");
		//建立圖檔對象
		JLabel pictureshow = new JLabel(picture);
		//建立圖檔标簽對象
		loginJFrame.add(pictureshow);
		//顯示圖檔
		
		JTextField text = new JTextField();
		//建立文本框
		JPasswordField password = new JPasswordField();
		//建立密碼框
		JButton button = new JButton("登入");
		//建立指令按鈕
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密碼框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//指令按鈕尺寸
		
		JLabel text2 = new JLabel("新增賬號");
		JLabel text3 = new JLabel("找回密碼");
		JLabel text4 = new JLabel("記住密碼");
		JLabel text5 = new JLabel("自動登入");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//建立複選框對象
		
		loginJFrame.add(text);
		//顯示文本框
		loginJFrame.add(text2);
		//顯示新增賬號
		
		loginJFrame.add(password);//顯示密碼框
		loginJFrame.add(text3);//顯示找回密碼
		loginJFrame.add(checkbox1);//顯示複選框1
		loginJFrame.add(text4);//顯示記住密碼
		loginJFrame.add(checkbox2);//顯示複選框2
		loginJFrame.add(text5);//顯示自動登入
		loginJFrame.add(button);//顯示指令按鈕
		
		
		loginJFrame.setVisible(true);//設定可見
		}
           

關于圖檔的引用,這裡聲明一下:

右鍵點選圖檔,找到“屬性”,找到裡面圖檔的路徑,将其複制到建立圖檔對象行代碼末尾的括号裡(需加雙引号),路徑中單個的“\”改為“\”,然後再用“\”分隔開,接着複制粘貼圖檔的全名(含圖檔格式尾綴)即可。

注意:最後要設定窗體可見!

接下來,建立主函數,代碼如下:

public static void main(String[] args)
	{
		login loginshow = new login();
		loginshow.show();
	}
}
           

運作,即可得到文章開頭的窗體示例。

(二)建立事件監聽器

我們拟達成的效果是:在點開“登入”按鈕後,會顯示一個新的界面。

我們要做的是,在“登入”按鈕上添加監聽器。

具體在剛才給button按鈕添加尺寸的下方進行建立,具體代碼如下(新添加的代碼,即建立監聽器的代碼進行了加粗):

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信圖檔_20190616173720.png");
		//建立圖檔對象
		JLabel pictureshow = new JLabel(picture);
		//建立圖檔标簽對象
		loginJFrame.add(pictureshow);
		//顯示圖檔
		
		JTextField text = new JTextField();
		//建立文本框
		JPasswordField password = new JPasswordField();
		//建立密碼框
		JButton button = new JButton("登入");
		//建立指令按鈕
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密碼框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//指令按鈕尺寸

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信圖檔_20190616173720.png");
		//建立圖檔對象
		JLabel pictureshow = new JLabel(picture);
		//建立圖檔标簽對象
		loginJFrame.add(pictureshow);
		//顯示圖檔
		
		JTextField text = new JTextField();
		//建立文本框
		JPasswordField password = new JPasswordField();
		//建立密碼框
		JButton button = new JButton("登入");
		//建立指令按鈕
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密碼框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//指令按鈕尺寸


        **QQButton qqbutton = new QQButton();
		button.addActionListener(qqbutton);
		//設定監聽器**
		
		JLabel text2 = new JLabel("新增賬號");
		JLabel text3 = new JLabel("找回密碼");
		JLabel text4 = new JLabel("記住密碼");
		JLabel text5 = new JLabel("自動登入");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//建立複選框對象
		
		loginJFrame.add(text);
		//顯示文本框
		loginJFrame.add(text2);
		//顯示新增賬號
		
		loginJFrame.add(password);//顯示密碼框
		loginJFrame.add(text3);//顯示找回密碼
		loginJFrame.add(checkbox1);//顯示複選框1
		loginJFrame.add(text4);//顯示記住密碼
		loginJFrame.add(checkbox2);//顯示複選框2
		loginJFrame.add(text5);//顯示自動登入
		loginJFrame.add(button);//顯示指令按鈕
		
		
		loginJFrame.setVisible(true);//設定可見
		}
		
		JLabel text2 = new JLabel("新增賬號");
		JLabel text3 = new JLabel("找回密碼");
		JLabel text4 = new JLabel("記住密碼");
		JLabel text5 = new JLabel("自動登入");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//建立複選框對象
		
		loginJFrame.add(text);
		//顯示文本框
		loginJFrame.add(text2);
		//顯示新增賬號
		
		loginJFrame.add(password);//顯示密碼框
		loginJFrame.add(text3);//顯示找回密碼
		loginJFrame.add(checkbox1);//顯示複選框1
		loginJFrame.add(text4);//顯示記住密碼
		loginJFrame.add(checkbox2);//顯示複選框2
		loginJFrame.add(text5);//顯示自動登入
		loginJFrame.add(button);//顯示指令按鈕
		
		
		loginJFrame.setVisible(true);//設定可見
		}
           

注:QQButton是點選登入按鈕後能顯示界面新建立的一個窗體顯示類。

我們打開QQButton的源代碼,發現:

public void addActionListener(ActionListener l) {
        listenerList.add(ActionListener.class, l);
    }
           

接着打開第二行中ActionListener的源代碼,發現:

public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);

}
           

interface是一個借口,它來作為一個媒介,不能建立對象,隻有方法名,沒有方法體,實作接口需要重寫所有的方法。

extends是繼承,即子類可以繼承父類的public protected關鍵字下的全部屬性,方法。

關于繼承,将在下一篇文章中寫到。

在新的QQButton類,我們添加以下幾個類名:

import java.awt.event.ActionListener;//動作監聽器類
import javax.swing.JFrame;//新視窗
import java.awt.FlowLayout;//流式布局
import javax.swing.ImageIcon;//添加圖檔
import javax.swing.JLabel;//标簽
import java.awt.event.ActionEvent;//動作事件類
           

然後還是,為了按下登入按鈕後,能産生一個新的界面,我們按老方法建立一個窗體,代碼如下:

public class QQButton implements ActionListener {
//為了實作接口,需添加關鍵字implements。
	
	
	
	
	public void actionPerformed(ActionEvent n){
		System.out.println("登入成功!");
		JFrame jframe = new JFrame();
		jframe.setTitle("QQ");
		jframe.setSize(200, 240);
		jframe.setDefaultCloseOperation(3);
		jframe.setLocationRelativeTo(null);
		jframe.setVisible(true);
		//設定新窗體
		
		FlowLayout flow = new FlowLayout();
		jframe.setLayout(flow);
		//新窗體流式布局
		
		ImageIcon icon = new ImageIcon("C:\\Users\\dell\\Desktop\\Adobe\\微信圖檔_20190630000514.jpg");
		JLabel jlabel = new JLabel(icon);
		jframe.add(jlabel);
		//添加圖檔
		}
}

           

OK,運作程式,就會出現如片頭所示圖檔的效果了。

歸根結底,為了實作新的界面,就是在對應的按鈕處添加動作監聽器,然後在新的實作接口類中把接口中的方法進行實作并定義出新的窗體或指令,其中需用到繼承的知識,我會在下篇文章中簡要講解。

2019.06.29
                                                                                                       筆者于湖南長沙