Java學習疑惑(8)----可視化編程, 對Java中事件驅動模型的理解

我們編寫程序就是爲了方便用戶使用, 我覺得UI設計的核心就是簡潔, 操作過於繁瑣的程序讓很大一部分用戶敬而遠之. 即使功能強大, 但是人們更願意使用易於操作的軟件. 近年流行起來的操作手勢和逐漸趨於成熟的語言控制以及其他更加易於操作的方式很可能會顛覆鼠標鍵盤的操作方式, 我相信這一天必將到來.

電影<<普羅米修斯>>中畫面

我記得我去年編寫了我的第一個用戶界面, 現在想起來當時非常令我困惑的有兩項: 

  1. 不知道該如何將自己原來的功能代碼與新建的圖形界面聯繫在一起, 對衆多的監聽器不知從何下手.
  2. 不論我怎樣修改代碼, 界面都是那麼地奇醜無比. 對各式各樣的佈局管理器一籌莫展. 以至於在我分享代碼的時候直接忽略了圖形界面這塊, 交由更加擅長設計UI界面的程序員完善.
我當時的困惑很可能和今後學習圖形界面的朋友差不多, 所以在最近的文章中我們來重點看一下學習Java GUI時容易令人混淆和疑惑的內容以及分享一下我在學習這塊內容時遇到的阻礙. 筆者在此只是拋磚引玉, 非常歡迎廣大編程愛好者能夠發表自己對這塊知識點的見解與大家一同探討交流.
  • 給各個組件添加合適的監聽器
我們只是創建了各種漂亮炫酷的組件還不遠遠夠, 我還需要將其與應用程序的核心功能建立聯繫, GUI中的事件驅動模型恰恰建立了兩者聯繫的橋樑. 


事件源:能夠接收外部事件的源體。例如窗體(Component) 面板(Panel) 文本框(TextField)等等

偵聽器:能夠接收事件源通知的對象。例如MouseListener  KeyListener

事件處理程序:用於處理事件的對象。Event

任何基於事件驅動模型的開發技術都包含一下三大要素, 不管是.net還是java編程語言, 甚至是很多人第一次接觸的VB語言都有基於以上三大要素的事件驅動模型開發流程. 所以我們在學習可視化編程之前, 理解這個重要模型還是相當重要的. 我們先從一個具體事例中理解這個模型吧.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ListenerDemo {
	JFrame frame;
	JPanel panel;
	JButton atk;
	JButton fig;
	JTextField text;
	
	public ListenerDemo() {
		init();
		addListener();
	}
	
	public void init() {
		frame = new JFrame("Test");
		frame.setSize(200, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		//這裏其實是添加了一個窗體監聽器WindowsListener, 
																	// 設置用戶按下窗體上CLOSE按鈕發生的事件
		panel = new JPanel();
		
		atk = new JButton("ATK");
		fig = new JButton("FIG");
		text = new JTextField(15);
		
		frame.add(panel);
		panel.add(text);
		panel.add(atk);
		panel.add(fig);
		
		frame.setVisible(true);
	}
	
	public void addListener() {
		ActionListener listener = new ActionListener() {	// 定義了一個ActionListener(用於接收操作事件的偵聽器)
			public void actionPerformed(ActionEvent e) {
				JButton button = (JButton)e.getSource();
				String name = button.getText();
				text.setText("你按下的按鈕是 :" + name);
				// button.removeActionListener(this);		// 取消這段代碼的註釋, 那麼按鈕的偵聽事件只會執行一次
			}
		};
		
		atk.addActionListener(listener);
		fig.addActionListener(listener);
	}
	
	public static void main(String[] args) {
		ListenerDemo demo = new ListenerDemo();
	}
}
上面的事例實現了一個非常簡單的事件驅動模型, 在此就以模型的結構描述一下事件從發生到結束是怎麼樣進行的.
事件源:兩個JButton按鈕 atk 和 fig
偵聽器:ActionListener, 用於接收操作事件的偵聽器, 是Java中最長用到的偵聽器之一.
事件處理程序: 這裏的事件處理程序全部封裝在偵聽器對象中的actionPerformed方法中. 當事件源發生了操作事件, 就調用該方法.
從以上分析看來, 程序目的清晰可見了, 當按下其中一個按鈕時, 在文本框中顯示所按下按鈕的名稱.
不僅僅是ActionListener, 監聽器的種類很多, 我們在爲組件添加偵聽器之前, 得了解各個偵聽器對應的功能, 下面列舉一下幾個常用的偵聽器.
  • KeyListener該偵聽器接收鍵盤事件. 主要偵聽動作有按下, 釋放和鍵入某個鍵
  • MouseListener用於偵聽組件上的鼠標事件(按下、釋放、單擊、進入或離開), 需要實現發生類似事件響應功能可選擇使用.
  • ComponentListener 用於接收組件事件的偵聽器, 當組件的可見性, 位置和大小發生改變時就會產生響應. 調用對應的方法. 
這裏有一點需要注意一下, 我們在向一個組件添加偵聽器對象時, 由於這裏ComponentListener是接口不能直接new創建對象, 而我們只需要調用該接口中的一個方法時, 如果自己新建一個類實現該接口就必須要實現這個接口中的所有方法, 未免顯得有點愚笨了, 爲此, Java特意提供了一種叫做適配器的類(Adapter). 適配器類存在的目的就是爲了方便創建偵聽器對象. 我們只需要拓展創建偵聽器接口對應的適配器類的對象然後重寫一下我們需要的事件方法就行了. 如何創建一個簡潔, 易於交互使用的圖形界面程序, 我們在下一篇文章將會針對此作深入分析.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章