曾經滄海難爲水,除卻巫山不是雲。
事件監聽器
-
類要對用戶事件作出響應,必須實現處理該事件的接口,這些接口被稱爲事件監聽器。
-
每個監聽器都處理特定的事件,類可以根據需要實現任意數目的監聽器。
-
監聽器模型涉及以下三個對象,模型圖如下:
(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()中才去措施來組織窗口關閉。