監聽器、事件、事件源、事件註冊深度剖析
阿新 • • 發佈:2018-10-04
left local ets clas imp for 圖形 沒有 執行
- AWT事件處理
事件處理機制,幾類具有典型代表意義的事件:
幾種常用事件處理機制
查看JDK Doc文檔中的
- 用戶圖形界面的行為
1、事件類型
(1)事件類的層次結構圖如下所示。許多事件類在java.awt.event包中,也有一些事件類在API的其他地方。
(2)對於每類事件,都有一個接口,這個接口必須由想接收這個事件的類的對象實現。這個接口還要求定義一個或多個方法。當發生特定的事件時,就會調用這些方法。
2、事件類的結構圖:不需要記,用的時候學會查看JDK文檔即可。
3、方法類型和接口
demo程序如下:
package com.ahueir.awt;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Date;
public class MyFrame2 {
public static void main(String[] args) {
Frame frame = new Frame("My Frame2");
/*
* 在JDk 中查找frame類裏面的addXxxListener類似的方法,找不到再從其父類中尋找
*/
frame.addWindowListener(new MyWindowListener());
Button button = new Button("Click Me");
button.addActionListener(new MyListener());
frame.add(button);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
class MyListener implements ActionListener{
@Override
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
/*
* 時間就是按格林威治時間:January 1, 1970, 00:00:00 GMT.到當前所經歷的毫秒數。
* 將這個毫秒數轉化為時間
*/
long milliSeconds = e.getWhen();
/*
* 查看JDK Doc文檔中的Date類的 public Date(long date)
*/
Date date = new Date(milliSeconds);
System.out.println(date.toLocaleString());
}
}
class MyWindowListener implements WindowListener{
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("關閉窗口");
System.exit(0); //推出Java虛擬機
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
編譯執行結果產生一個窗口,這裏不截圖出來了,輸出以下內容:
2013-1-13 21:25:39
關閉窗口
下面我們聯系以下兩個監聽器的使用方法:
Demo程序如下所示:
package com.ahueir.awt;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class TwoListen implements MouseListener, MouseMotionListener{
private Frame frame;
private TextField textField; //文本框
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
//當鼠標退出Frame後,在命令行中打印出信息
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has left the Frame";
this.textField.setText(str);
}
//鼠標拖動的時候,註意是點擊拖動
@Override
public void mouseDragged(MouseEvent e) {
/*
* 對於圖形界面來說,窗口的坐上角是起點
*/
String str = "x: " + e.getX() + ", y:" + e.getY();
this.textField.setText(str); //將鼠標拖動獲得的信息加到文本框中
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
public void go(){
frame = new Frame("Two Listener Example");
frame.add(new Label("click"), BorderLayout.NORTH); //添加一個 Label:標簽
textField = new TextField(30); //表示文本框的長度為30
frame.add(textField, BorderLayout.SOUTH);
frame.addMouseMotionListener(this); //使用this表示直接使用本類中當前的對象
frame.addMouseListener(this);
frame.addMouseListener(new MyMouseListener());
frame.setSize(300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
TwoListen two = new TwoListen();
two.go();
}
}
class MyMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
String str = "The mouse has entered the Frame";
System.out.println(str);
}
@Override
public void mouseExited(MouseEvent e) {
String str = "The mouse has exited the Frame";
System.out.println(str);
}
}
編譯執行結果如圖所示:
【說明】:對於同一個事件源,註冊兩個同種類型的監聽器是沒有問題的,而且他們同時的都會發生作用。如下圖所示:
【說明】:同一個事件源觸發三種相同的事件類型,這三個事件處理器都會執行
監聽器、事件、事件源、事件註冊深度剖析