swing-監聽器

曾經滄海難爲水,除卻巫山不是雲。

事件監聽器

  • 類要對用戶事件作出響應,必須實現處理該事件的接口,這些接口被稱爲事件監聽器。

  • 每個監聽器都處理特定的事件,類可以根據需要實現任意數目的監聽器。
    監聽器模型

  • 監聽器模型涉及以下三個對象,模型圖如下:
    (1)事件:用戶對組件的一個操作,稱之爲一個事件
    (2)事件源:發生事件的組件就是事件源
    (3)事件監聽器(處理器):監聽並負責處理事件的方法

  • 在java中,事件監聽器包含如下接口:
    (1)ActionListener:行爲事件,由用戶對組件執行某種操作(如單擊按鈕)觸發。
    (2)AdjustmentListener:調整事件,組件被調整(如移動滾動條上的滑塊時)觸發。
    (3)FocusListener:鍵盤焦點事件,諸如文本框等組件獲得或失去焦點時觸發。
    (4)ItemListener:選項事件,諸如複選框等選項被修改時激發。
    (5)KeyListener:鍵盤事件,用戶通過鍵盤輸入文本時激發。
    (6)MouseListener:鼠標事件,鼠標單擊,鼠標移入 ,或離開組件時觸發。
    (7)MouseMotionListener:鼠標移動事件,跟蹤鼠標在組件上的運動。
    (8)WindowListener:窗口事件,窗口(如應用程序的主窗口)被最大化、最小化、移動或關閉時被觸發。

  • 執行順序如下:
    1、給事件源註冊監聽器
    2、組件接受外部作用,也就是事件被觸發
    3、組件產生一個相應的事件對象,並把此對象傳遞給與之關聯的事件處理器
    4、事件處理器啓動,並執行相關的代碼來處理該事件。

給組件註冊監聽器

創建組件之後,可以通過下面的方法將組件和監聽器關聯起來。
(1)addActionListener():JButton、JCheck、JComboBox、JTextField、JRadioButton
(2)addAdjustmentListener():JScrollBar組件
(3)addFoucusListener():所有的swing組件
(4)addItemListener():JButton、JCheckBox、JComboBox和JRadioButton組件
(5)addKeyListener():所有的swing組件
(6)addMouseListener():所有的swing組件
(7)addMouseMotionListener():所有的swing組件
(8)addWindowListener():所有的JWindow和JFrame組件。
將組件加入容器之前,必須將組件和監聽器關聯起來,並完成其他配置操作,否則當程序運行時,這些設置將被忽略。

事件處理方法

  • 所有的add方法都接受一個參數:對事件進行監聽的對象,This表示當前類就是事件監聽器。也可以指定其他的對象,只要它實現了相應的監聽器接口。
  • 就事件監聽器來說,每個方法都是由窗口系統自動調用的,這是在對應的用戶事件發生時進行的。
  • 如果多個組件有相同的監聽器,則必須判斷程序中哪個組件被使用了,每種事件處理方法都接受某種事件對象作爲參數,這種對象的方法getSource()可用來判斷激發事件的組件。

行爲事件

  • 行爲事件在用戶使用JButton,JCheckBox,JComboBox,JTextField
    JRadioButton.時發生的。
  • 要處理這些事件,類必須實現接口ActionListener。此外,必須對每個要激發行爲事件的組件調用addActionListener()。
  • 方法actionPerformed(Action Event)是接口ActionListener中唯一的方法,其格式爲:
			public void actionPerformed(ActionEvent evt){
			}

行爲事件實例

package ActionListenerDemo;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ActionListenerDemo extends JFrame implements ActionListener {
   
	JButton btn1 = new JButton("Rosencrants");
	JButton btn2 = new JButton("Guidenstern");
	 public ActionListenerDemo(){
	    super("title bar");
	    setDefaultCloseOperation(EXIT_ON_CLOSE);
	   btn1.addActionListener(this);
	   //this指傳遞的是當前對象,也可傳遞其他的但必須實現ActionListener接口的對象。
	  //當事件發生,自動調用傳遞的參數的actionPerformed()函數。
	   btn2.addActionListener(this);
	   //必須先註冊監聽器事件,再加入容器中,否則會被忽略。
	   getContentPane().setLayout(new FlowLayout());
	   getContentPane().add(btn1);
	   getContentPane().add(btn2);
	    pack();
		 setVisible(true);
	 }
	public static void main(String[] args) {
		  JFrame frame =new ActionListenerDemo();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		      //e是觸發的事件對象
		if(e.getSource()==btn1){
			//通過getSource()獲取激發事件的組件。
			setTitle("Rosencrants");
		}
			else if(e.getSource()==btn2){
				setTitle("Guidenstern");
			}
	}
}

運行結果

  • 除方法getSource()外,還可以調用ActionEvent對象的方法getActionCommand()來獲得有關事件來源的更詳細的信息。
  • 默認情況下,動作命令(action Commend)是與組件相關聯的文本,如JButton上的標籤。您還可以調用組件的setActionCommend(String)方法來設置不同的動作命令。其中字符串參數是希望的動作命令文本。
  • 當程序中多個組件可能觸發相同的事件時,動作命令非常有用,例如程序中有一個Quit按鈕,同時下按菜單中有一個Quit選項,通過將相同的動作命令指定爲這兩個組件,可以在事件處理方法中使用相同的處理代碼來處理他們。

調整事件

  • 調整事件是在用戶移動JScrollBar組件(通過使用滾動條上的箭頭、滑塊、或者單擊滾動條)時發生,要處理這些事件,類必須實現AdjustmentListener接口。
  • adjustmentValueChanged(AdjustmentEvent)是AdjustmentListener接口中唯一的方法,格式如下:
		public void adjustmentValueChanged(AdjustmentEvent evt){
		}
  • 要在事件處理方法中查看JScrollBar的當前值,可以調用AdjustmentEvent對象的getValue()方法。該方法返回一個表示滾動條的值的整數。
  • getAdjustmentType()方法來判斷用戶移動滾動條的方式,該方式返回的是Adjustment類的類變量。
    UNIT_INCREMENT:加1,可能是單擊滾動條箭頭或使用光標鍵的結果
    UNIT_DECREMENT:減1,;
    BLOCK_INCREMENT:增加較大的值,可能是在滾動條的滑塊和箭頭之間單擊引起的
    BLOCK_DECREMENT:減少較大的值。
    實例
package ActionListenerDemo;

import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class AdjustmentDemo extends JFrame implements AdjustmentListener {

	 JTextField value = new JTextField("50",30);
	 JScrollBar scrollBar =new JScrollBar(SwingConstants.CENTER,50,10,0,100);
	//進度條初始值爲50 
	 public AdjustmentDemo(){
		    super("title bar");
		    setDefaultCloseOperation(EXIT_ON_CLOSE);
		    value.setHorizontalAlignment(SwingConstants.CENTER);
		    //設置文字居中顯示
		    scrollBar.addAdjustmentListener(this);
		   getContentPane().add(value, "Center");
		   getContentPane().add(scrollBar, "South");
		   pack();
		   setVisible(true);
	 }
	public static void main(String[] args) {
		 JFrame frame =new AdjustmentDemo();
	}

	@Override
	public void adjustmentValueChanged(AdjustmentEvent e) {
	          if(e.getSource()==scrollBar){
	        	  value.setText(""+scrollBar.getValue());
	          }
	}

}

運行結果

焦點事件

  • 焦點事件是在圖形用戶界面上的組件在獲得或失去焦點時發生,獲得焦點表明組件可以接受鍵盤輸入,當文本框獲得焦點時(在包含多個可編輯的文本框的用戶界面中)時,其中將有一個閃爍的光標。文本將被輸入到該組件中。
  • 焦點適合於任何可接收輸入的組件,獲得焦點的組件有一個虛線框。
  • 要處理焦點事件,類必須實現接口FocusListener。該接口包含兩個方法:focusGained(FocusEvent)和focusLost(FocusEvent)。格式如下:
			public void focusGained(focusEvent evt){
			}
			public void focusLost(focusEvent evt){
			}

實例

package ActionListenerDemo;

import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class FocusDemo extends JFrame implements FocusListener {
	  JTextField tfTest[] = new JTextField[3];
	  int arr_size =  3;
	public FocusDemo(){
		   super("title bar");
		    setDefaultCloseOperation(EXIT_ON_CLOSE);
		    getContentPane().setLayout(new GridLayout(3,1));
		    for(int i=0;i<arr_size;i++){
		    	tfTest[i] = new JTextField(i);
		    	tfTest[i].addFocusListener(this);
		    	getContentPane().add(tfTest[i]);
		      
		    }
		    pack();
		    setVisible(true);
	}

	public static void main(String[] args) {
		   JFrame frame =new FocusDemo();
	}

	@Override
	public void focusGained(FocusEvent e) {
		   JTextField  mid = (JTextField)e.getSource();
		   mid.setText("獲得了焦點");
	}

	@Override
	public void focusLost(FocusEvent e) {
		   JTextField  mid = (JTextField)e.getSource();
          mid.setText("失去了焦點");
          
	}
}

運行結果

鍵盤事件

  • 鍵盤事件在鍵盤上的鍵按下時發生,任何組件都可以激發這些事件,要支持這些事件,類必須實現KeyListener。
  • 接口KeyListener中有三個方法:keyPressed(KeyEvent)、keyReleased(KeyEvent)、KeyTyped(KeyEvent)。它們的格式如下:
		public void keyPressed(KeyEvent evt){//鍵盤按下
		}
		public void keyReleased(KeyEvent evt){//鍵盤釋放
		}
		public void keyTyped(KeyEvent evt){//鍵盤按下又釋放
		}
  • KeyEvent的方法getKeyChar()返回與事件相關聯的鍵盤字符。如果沒有與按下的鍵對應的Unicode,getKeyChar()將返回一個等於類變量KeyEvent.CHAR_UNDEFINED的字符值。

實例

package ActionListenerDemo;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class KeyListenerDemo extends JFrame implements KeyListener {

	public KeyListenerDemo(){
		 super("title bar");
		    setDefaultCloseOperation(EXIT_ON_CLOSE);
		    JTextField textField =new JTextField();
		    textField.addKeyListener(this);
		    getContentPane().add(textField, "Center");
		    pack();
		    setVisible(true);
	}
	public static void main(String[] args) {
	       JFrame frame =new KeyListenerDemo();
	}

	@Override
	public void keyTyped(KeyEvent e) {
		   System.out.println("鍵入一個值");
	}

	@Override
	public void keyPressed(KeyEvent e) {
		System.out.println("鍵被按下");
	}

	@Override
	public void keyReleased(KeyEvent e) {    
		System.out.println("鍵被釋放");
	}

}

鼠標事件

  • 鼠標事件是由以下幾種用戶交互激發的
    鼠標單擊
    鼠標進入組件區域
    鼠標離開組件區域
  • 任何組件都可以觸發這些事件,類通過接口MouseListener來實現這些事件。該接口有五個方法:
    mouseClicked(MouseEvent)//鼠標點擊
    mouseEntered(MouseEvent)//鼠標進入組件
    mouseExit(MouseEvent)//鼠標離開組件
    mousePressed(MouseEvent)//鼠標按下
    mouseReleased(MouseEvent)//鼠標釋放
    格式爲:
		public void mousePressed(MouseEvent e) {
			
			}
  • 可用MouseEvent對象調用下述方法:
    getClickCount() 返回一個整數,鼠標被單擊的次數
    getPoint():返回一個Point對象,指出單擊位置在組件中的(x,y)座標
    getX():返回單擊位置的x座標
    getY():返回單擊位置的y座標

鼠標移動事件

  • 鼠標移動事件是在鼠標經過組件時發生,要支持這種事件,類必須實現接口MouseMotionListener。
  • MouseMotionListener 接口有兩個方法:mouseDragged(MouseEvent)和mouseMoved(MouseEvent),它們的格式:
		public void mouseDragged(MouseEvent evt){
		}//鼠標拖動時調用
		public void mouseMoved(MouseEvent evt){
		}//鼠標移動時調用
  • 與其他的事件監聽接口不同,MouseMotionListener並沒有自己的事件類型,它使用的是MouseEvent對象。我們可以調用與鼠標事件相同的方法:getClick()、getPoint()、getX()、getY()。

實例

package ActionListenerDemo;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Paint;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MouseMotionListenerDemo extends JFrame implements java.awt.event.MouseMotionListener{

	public MouseMotionListenerDemo(){
		 super("title");
		 setSize(100, 100);
		 setDefaultCloseOperation(EXIT_ON_CLOSE);
		 JTextArea textArea =new JTextArea();
		 textArea.addMouseMotionListener(this);
		 getContentPane().add(textArea, "Center");
		
		 setVisible(true);
	}
	public static void main(String[] args) {
		  JFrame frame = new MouseMotionListenerDemo();
  
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		    Graphics g = getGraphics();//得到當前繪圖環境
		    g.setColor(Color.RED);
		    g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
		 
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		System.out.println("鼠標位置: "+e.getX()+" "+e.getY());
	}

}

選項事件

  • 選項事件在下述組件中的選項被選中或者取消選中時發生:JButton,JCheckBox,JComboBox或JRadioButton。要處理這些事件,類必須實現藉口ItemListener。
  • ItemStateChanged(ItemEvent)是接口ItemEvent的唯一的一個方法。其格式如下:
			void itemStateChanged(ItemEvent evt){
			}

要確定事件發生在哪個選項上,可以調用ItemEvent對象的getEvent()方法。getItem()方法會觸發兩次ItemListener事件,一次是取消選中,一次是重新選中。

  • 可以使用方法getStateChange()來判斷選項是被選中還是被取消選中。該方法返回一個整數值,它等於類變量ItemEvent.DESELECTED或ItemEvent.SELETED。

實例

package ActionListenerDemo;

import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ItemListenerDemo extends JFrame implements ItemListener{
   
	public  ItemListenerDemo(){
		 super("title");
		 setDefaultCloseOperation(EXIT_ON_CLOSE);
		 String sel[] = new String[]{"man","female","boy","girl"};
		 JComboBox cBoxTest = new JComboBox(sel);
		 cBoxTest.addItemListener(this);
		 getContentPane().setLayout(new FlowLayout());
		 getContentPane().add(cBoxTest);
		 pack();
		 setVisible(true);
	}
	public static void main(String[] args) {
		     JFrame frame =new ItemListenerDemo();
	}
	@Override
	public void itemStateChanged(ItemEvent e) {
		   if(e.getStateChange()==ItemEvent.SELECTED){
			   //如果不判斷就輸出,每次改變時,會輸出兩條,一條是取消選中的
			   //一條是重新選中的
			   System.out.println(e.getItem());
		   }
	}

}

窗口事件

  • 窗口事件在用戶打開或者關閉諸如JFrame或JWindow等窗口對象時發生,任何組件都可以激發這種事件。要支持它們,類必須實現接口WindowListener。

  • 接口WindowListener有七個方法:
    windowActivated(WindowEvent)
    windowClosed(WindowEvent)
    windowClosing(WindowEvent)
    windowDeactivated(WindowEvent)
    windowDeiconified(WindowEvent)
    windowIconified(WindowEvent)
    windowOpended(WindowEvent)

  • windowClosing()和windowClosed()極其類似,但前者在窗口正關閉時調用,後者在關閉後調用,實際上,可以在windowClosing()中才去措施來組織窗口關閉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章