java關於事件的簡單介紹
本文來自CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u013412772/article/details/52204148?utm_source=copy
本文關鍵詞:事件、事件處理基本原理、事件物件、多重監聽器、事件介面卡、事件型別
學習java事件之前,對java內部類、java常用元件、容器、佈局管理器、java抽象視窗工具包這些東西有一定的瞭解,結合下面的知識點,可以做一些簡單的視窗程式。
Java語言對事件的處理採用的是授權事件模型。在這個模型下,每個元件都有相應的事件,如按鈕有單擊事件,文字域具有內容改變事件等。當某個事件被觸發後,元件就會將事件傳送給元件註冊的每一個事件監聽器,事件監聽器中定義了與不同事件相對應的事件的處理,此時事件監聽器會根據不同的事件資訊呼叫不同的事件處理者,完成對這次事件的處理,只有事件監聽器被觸發後才會收到事件資訊。此種模型的顯著特點是,當元件被觸發後,本身不去處理,而將處理的 操作交給第三方完成。例如,在GUI單擊了一個按鈕,此時該按鈕就是一個事件源物件,按鈕本身沒有權利對這次單擊做出反應,它做的就是將資訊傳送給本身註冊的監聽器(事件的處理者,實質上也是個類)來處理。
理解java的事件處理要要理解下面三個重要的概要。
(1)、事件Event——使用者操作而產生的事件
(2)、事件源Event source——產生事件的元件
(3)、事件處理方法Event handle——處理事件的方法
-
1、事件處理基本原理
擋在一個按鈕上觸發一個事件時,虛擬機器產生一個點選事件物件,然後在按鈕即事件源上查詢註冊的相關處理方法,並將事件物件傳給此方法,此方法獲得執行。
示例程式:
在下面的程式中JButton jb就是事件源,ClickAction就是事件處理程式,jb.addActionListener(a);將事件源和事件處理程式關聯起來,當事件源上發生點選事件的時候,執行ClickAction裡面定義的程式碼。
原始碼如下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class EventTest { public static void main(String[] args) { JFrame j = new JFrame("示例程式1"); //1、事件源jb按鈕就是事件源,因為要點選它 JButton jb = new JButton("click"); //2、事件處理程式ClickAction表示事件處理程式 ClickAction a = new ClickAction(); //3、關聯,將事件源和事件處理程式a關聯起來,意思是發生點選執行a jb.addActionListener(a); //將jb源事件新增到視窗中。 j.getContentPane().add(jb); j.pack(); j.setVisible(true); } } //事件處理程式,點選就是一個Action事件 class ClickAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("hello"); } }
-
2、事件物件
在上面你的例子中,ActionEvent就是一個事件物件,在JButton被按下的時候,由JButton生成此事件。事件被傳遞給通過註冊監聽器的方式註冊的ActionListener物件,通過它可以得到事件發生的時間,事件發生時的事件源等最常見的資訊。
ActionEvent常見方法如下: (1)String getActionCommand():返回與此類動作相關的命令字串,預設元件為title。 (2)int getModifiers():返回發生此動作時同時按下的鍵盤按鈕 (3)long getWhen():返回發生此事件時的事件的long形式。
示例程式:
原始碼如下:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class EventTest2 {
public static void main(String[] args) {
JFrame j = new JFrame("示例程式2");
JPanel jp = new JPanel();
JLabel j1 = new JLabel("請點選");
JButton jb = new JButton("click");
JButton jb1 = new JButton("click");
ClickAction2 a = new ClickAction2();
jb1.addActionListener(a);//如果jb1上發生了Action事件就執行a裡面的程式碼
jb.addActionListener(a);
jp.add(j1);
jp.add(jb);
jp.add(jb1);
j.add(jp);
j.setSize(400, 200);
j.setVisible(true);
}
}
class ClickAction2 implements ActionListener{
//事件發生時,actionPerformed方法會被虛擬機器呼叫,事件物件回傳給該方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
long d = e.getWhen();//事件發生的事件
Date date = new Date(d);//轉化為相應的時間
System.out.println(date);
JButton sou = (JButton)e.getSource();//發生的事件源
sou.setText("點不著");//將點擊發生的按鈕的按鈕設為點不著
//如果沒有設定過ActionCommand,預設得到的是按鈕的標題
String com = e.getActionCommand();
System.out.println("command is: " +com);
}
}
-
3、事件型別
圖形介面開發中由很多的事件,這些事件以EventObject為頂層和類,按事件的型別構成了一個樹形結構。
- 1
具體見下圖:
EventObject是所有事件類的父類,它裡面包含兩個方法: (1)、Object getSource():最初發生Event的物件 (2)、String toString():返回此EventObject的String表示形式。 通過getSource():能夠知道事件是在那個物件上發生的。 關於其他事件類的含義,在下面會給出幾個類的原始碼解釋和簡單演練。
MouseEvent類
當在一個元件上按下,釋放,點選,移動或者拖動時,就會觸發滑鼠事件。
- 1
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MouseListenerTest {
public static void main(String[] args) {
JFrame j = new JFrame("我的視窗");
MouL w = new MouL();
j.addMouseListener(w);
j.setSize(100, 100);
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MouL implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("滑鼠的位置: " + e.getX() + "," + e.getY());
System.out.println("點擊發生了");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("按下");
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鬆開");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("滑鼠進入了視窗");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("滑鼠離開了視窗");
}
}
-
WindowEvent類
視窗事件,視窗開啟,關閉,最大化,最小化時,都會觸發視窗事件
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
public class WindowsListenerTest {
public static void main(String[] args) {
JFrame j = new JFrame("我的視窗");
WindowL w = new WindowL();
j.addWindowListener(w);
j.setSize(100, 100);
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class WindowL implements WindowListener{
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗開啟時我執行windowOpened");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowClosing");
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗關閉時我執行windowClosed");
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗最小化時我執行windowIconified");
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗回覆時我執行windowDeiconified");
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗變成活動狀態時我執行mouseClicked");
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("視窗變成不活動狀態時我執行windowDeactivated");
}
}
-
ContainerEvent類
當一個元件被加到容器中時或者從一個容器中刪除一個元件時,會觸發事件。
import java.awt.event.ContainerListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ContainerEvent {
public static void main(String[] args) {
JFrame j = new JFrame("我的視窗");
ContL w = new ContL();
JPanel jp = new JPanel();
jp.addContainerListener(w);
JButton del = new JButton("刪除");
JButton add = new JButton("add");
jp.add(add);
jp.add(del);//觸發元件添加了
jp.remove(del);//觸發元件刪除了
j.getContentPane().add(jp);
j.setSize(100, 100);
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class ContL implements ContainerListener{
@Override
public void componentAdded(java.awt.event.ContainerEvent e) {
// TODO Auto-generated method stub
System.out.println("元件添加了");
}
@Override
public void componentRemoved(java.awt.event.ContainerEvent e) {
// TODO Auto-generated method stub
System.out.println("元件刪除了");
}
}
-
FocusEvent
滑鼠點選等操作會讓一個元件得到或者失去焦點。當一個元件得到焦點的時候,或者失去焦點的時候,就會觸發焦點事件
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FocusTest {
public static void main(String[] args) {
JFrame j = new JFrame("key test");
JPanel jp = new JPanel();
JButton j1 = new JButton("1");
JButton j2 = new JButton("2");
j1.addFocusListener(new FocusL());
j2.addFocusListener(new FocusL());
jp.add(j1);
jp.add(j2);
j.add(jp);
j.setSize(600, 500);
j.setVisible(true);
}
}
class FocusL implements FocusListener{
@Override
public void focusGained(FocusEvent e) {
//得到FocusEvent發生時的物件,轉化為按鈕
// TODO Auto-generated method stub
JButton j = (JButton)e.getSource();
//得到按鈕的標題
String title = j.getText();
System.out.println("focusGained:按鈕" + title + "獲得焦點");
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
JButton j = (JButton)e.getSource();
String title = j.getText();
System.out.println("focusLost:按鈕" + title + "失去焦點");
}
}
4、多重監聽器
一般情況下,事件源可以產生多種不同型別的事件,因而可以註冊(觸發)多種不同型別的監聽器。
一個事件源元件上可以註冊多個監聽器,一個監聽器可以被註冊到多個不同的事件源上。
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class MultiListenerTest {
public static void main(String[] args) {
JFrame a = new JFrame("事件處理");
JTextField jf = new JTextField();
a.add(jf, "South");
MouseM m = new MouseM();
//同一事件源上註冊兩個事件監聽程式
//滑鼠的監聽程式如點選等
a.addMouseListener(m);
//滑鼠移動的監聽程式
a.addMouseMotionListener(m);
a.setSize(200, 200);
a.setVisible(true);
}
}
class MouseM implements MouseMotionListener, MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mousePressed");
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseRelsased");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseEntered");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseExited");
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("拖動:" + e.getPoint());
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("移動:" + e.getPoint());
}
}
5、事件介面卡(Event Adapter)
為簡化程式設計,JDK針對大多數事件監聽器介面定義了相應的實現類——事件介面卡類,在介面卡中,實現了相應監聽器介面中的所有的方法,但不做任何事情。
所以定義的監聽器類可以繼承事件介面卡類,並只重寫所需要的方法。
有如下介面卡:
- ComponentAdapter (元件介面卡)
- ContainerAdapter (容器介面卡)
- FocusAdapter (焦點介面卡)
- KeyAdapter (鍵盤介面卡)
- MouseAdapter (滑鼠介面卡)
- MouseMotionAdapter (滑鼠運動介面卡)
- WindowAdapter (視窗介面卡)
滑鼠介面卡示例程式:MouseListener中由多個方法,但在這裡只實現了mouseClicked()
package 圖形介面設計;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class AdapterTest {
public static void main(String[] args) {
JFrame z = new JFrame("事件介面卡測試");
z.setSize(500, 400);
MouseLS a = new MouseLS();
//註冊z上的滑鼠事件處理程式,發生點選等事件執行a裡的程式碼
z.addMouseListener(a);
z.setVisible(true);
z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MouseLS extends MouseAdapter{
public void mouseClicked(MouseEvent e){
// 打印出滑鼠點選時的x點和y點的座標
System.out.println("滑鼠點選了:" + e.getX() + "," + e.getY());
}
}
本文來自CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u013412772/article/details/52204148?utm_source=copy