事件處理:事件:用戶的一個操作(例如:點擊一下鼠標,或者敲擊一下鍵盤)事件源:被操作的組件(例如:在一個窗體中的一個按鈕,那個按鈕就屬于被操作的組件,按鈕就是事件源)監聽器:一個自定義的對象,實現了監聽接口,包含事件處理方式,把監聽器添加在事件源上,當事件發生的時候,虛擬機就會自動調用監聽器中的事件處理方法
package com.yy.gui;
//GUI功能簡單運用
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Demo1_Frame {public static void main(String[] args) {Frame f = new Frame("琪老師好!");f.setSize(400,600); //設置窗體大小(寬和高)f.setLocation(500, 50); //設置窗體初始的位置f.setIconImage(Toolkit.getDefaultToolkit().createImage("beyond.jpg"));Button b1 = new Button("我就不~不滾咋滴!!!"); //設置按鈕1,按鈕名稱:我就不~不滾咋滴!!!Button b2 = new Button("略略略"); //設置按鈕2,按鈕名稱:略略略f.add(b1);f.add(b2);f.setLayout(new FlowLayout()); //設置布局管理器//f.addWindowListener(new MyWindowAdapter());//WindowListenter是一個接口,不能直接new一個接口,但是我們可以傳這個接口的子類對象/*//窗體監聽//優化2,匿名內部類//public void windowClosing(WindowEvent e)窗口正處在關閉過程中時調用。此時可重寫關閉操作f.addWindowListener(new WindowAdapter(){ //WindowListener是一個接口,找個類去實現這個接口,重寫接口中的所有方法,然后去調用自己想要的方法,繼承WindowAdapter這個類//不能new接口,但是可以new這個接口的子類對象public void windowClosing(WindowEvent e){ //重寫所需要的方法System.exit(0);}});//new WindowAdapter(){}//new 類 (){} 表示去繼承這個類*//*//鼠標監聽,鼠標點擊進行指定操作//public void mouseClicked(MouseEvent e)鼠標按鍵在組件上單擊(按下并釋放)時調用//public void mouseReleased(MouseEvent e)鼠標按鈕在組件上釋放時調用b1.addMouseListener(new MouseAdapter(){ //匿名內部類,添加一個鼠標監聽,鼠標適配器public void mouseClicked(MouseEvent e){//單擊ClickedSystem.exit(0); //退出}public void mouseReleased(MouseEvent e){//釋放Released System.exit(0);}});*/ /*//鍵盤監聽以及鍵盤事件(滿足某種條件就去執行對應的方法)//public int getKeyCode()返回與此事件中的鍵關聯的整數 keyCode//返回: 鍵盤上實際鍵的整數代碼b1.addKeyListener(new KeyAdapter(){ //匿名內部類,添加一個鍵盤監聽器public void keyReleased(KeyEvent e){ //KeyEvent 鍵盤事件//System.out.println(e.getKeyCode()); //打印鍵盤上的鍵所對應的整數值第一種形式if(e.getKeyCode() == 32){ //32對應的鍵是空格鍵System.exit(0); //如果是空格鍵,退出程序}//第二種形式 if(e.getKeyCode() == KeyEvent.VK_SPACE){ //類名. 去調用這個靜態常量就可以//KeyEvent.VK_SPACE//類名 . VK_SPACE代表空格 VK_ENTER代表回車 ...System.exit(0); //退出程序}}}); //KeyListener也是一個接口,*//*//動作監聽b2.addActionListener(new ActionListener() { //添加動作監聽,應用場景就是暫停視頻和播放視頻@Overridepublic void actionPerformed(ActionEvent e) { //無論是敲空格鍵還是鼠標左鍵單擊,都會退出java虛擬機,因為空格鍵還是鼠標左鍵單擊是系統默認的System.exit(0);}});*/f.setVisible(true); //設置窗體可見}}//WindowAdapter:適配器,也是一個抽象類,定義為抽象類是為了,不想讓你去創建這個類的對象,因為,就算創建了這個類的對象,調用這個類的空方法也是沒有任何意義的。
//該抽象類實現了WindowListener這個接口,并且重寫了WindowListener這個接口中的所有的出抽象方法
//方便在于:如果以后你想用WindowListener這個接口,只需要繼承WindowAdapter這個類就可以了,想用那個方法,就重寫那個方法即可
//WindowAdapter該類中的方法都是空方法;
//目的在于:就是為了提供給子類去使用這些方法,而不是自己用的,然后,WindowAdapter這個類把這些方法都給重寫了,當子類去使用的時候,想用哪個方法,就直接重寫哪個方法即可/*class MyWindowListener implements WindowListener{ //創建WindowListener這個抽象類的子類對象
//如果一個抽象類中,沒有定義任何的抽象方法,那這個抽象類的作用只有一個,不允許其他的類來創建這個抽象類的對象@Overridepublic void windowOpened(WindowEvent e) { //重寫WindowListener這個接口里面的所有方法}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("Closing");System.exit(0);}@Overridepublic void windowClosed(WindowEvent e) {System.out.println("Closed");}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {}@Overridepublic void windowDeactivated(WindowEvent e) {}}
*//*優化1 class MyWindowAdapter extends WindowAdapter{ //創建一個類MyWindowAdapter去繼承WindowAdapter(適配器)這個抽象類
//該抽象類實現了WindowListener這個接口,并且重寫了WindowListener這個接口中的所有的出抽象方法,方便在于:如果以后你想用WindowListener這個接口,只需要繼承WindowAdapter這個類就可以了,想用那個方法,就重寫那個方法即可
//這里就不會去強制重寫任何方法,用哪個重寫哪個方法就可以 public void WindowClosing(WindowEvent e){ System.exit(0);}
}
*/
* A:什么是適配器* 在使用監聽器的時候,需要定義一個類事件監聽器接口* 通常接口中有多個方法,而程序中不一定所有的都能用到,但有必須重寫所有的方法,這很繁瑣* 適配器簡化了這些操作,我們定義監聽器時只要繼承適配器,然后重寫需要的方法即可* B:適配器原理(Adapter就是一個適配器)* 適配器就是一個類,實現了監聽器接口,所有的抽象方法都重寫了,但是方法全是空的* 適配器類需要定義成抽象的,因為創建該類對象,調用空方法都是沒有意義的* 目的就是為了簡化程序員的操作,定義監聽器時繼承適配器,只重寫需要的方法就可以了
* 適配器設計模式* 例如:魯智深(花和尚)。是個和尚(假如,和尚每天要做的事情為打坐、念經、撞鐘、習武),現在有一個 和尚 接口,該接口有打坐、念經、撞鐘、習武這四個方法,* 但是魯智深只喜歡習武,所以,讓魯智深去實現 和尚 這個接口是不合適的* 首先有個接口 和尚 ,和尚 這個接口里面有一些方法打坐、念經、撞鐘、習武* 而魯智深只喜歡習武,所以,這時候,我們就可以創建一個中間類 天罡星 ,這個 天罡星 這個類實現了這個 和尚 接口,實現 和尚 這個接口之后,重寫了 和尚 這個接口里面的所有抽象方法* 天罡星 這個類重寫了 和尚 里面的所有抽象方法,這些抽象方法都是空的,為了防止別人拿這個 天罡星 這個類去創建對象,于是就把 天罡星 這個類給聲明成抽象類* 把 天罡星 這個類聲明成抽象類的原因:不想讓其他類去創建本類對象,因為創建也是沒有意義的,天罡星 這個類里面的方法都是空的,這里的 天罡星 這個類就起到一個過渡的作用* 然后,創建一個 魯智深 類,讓 魯智深 這個類去繼承 天罡星 這個抽象類,于是,魯智深 這個類 想重寫哪個方法就重寫哪個方法就行了,由于魯智深只想習武,于是只需要重寫 習武 這個方法就行了* 然后,重寫 習武 這個方法,輸出倒拔垂楊柳,拳打鎮關西,大鬧野豬林...即可* 這時候,唐三藏來了,而他只喜歡打坐,念經,撞鐘,但是他不喜歡習武,于是,就可以定義一個 唐三藏 類去繼承 天罡星 這個抽象類 然后重寫他需要的方法即可;
代碼如下
package com.yy.適配器;public class Demo1_Adapter {public static void main(String[] args) {魯智深 yy = new 魯智深(); //創建 魯智深 這個類對象唐三藏 wsq = new 唐三藏(); //創建 唐三藏 這個類對象yy.習武(); //調用 魯智深 這個類中的 習武 方法wsq.念經(); //調用 唐三藏 這個類中的 念經 方法wsq.打坐(); //調用 唐三藏 這個類中的 打坐 方法wsq.撞鐘(); //調用 唐三藏 這個類中的 撞鐘 方法}}interface 和尚{ //定義一個 和尚 接口public void 打坐(); //這些是 和尚 這個接口的所有抽象方法public void 念經();public void 撞鐘();public void 習武();
}//適配器設計模式
abstract class 天罡星 implements 和尚{ //聲明成抽象類的原因是:不想讓其他類去創建本類對象,因為創建也是沒有意義的,方法都是空的
//這里的 天罡星 這個類就充當著適配器的作用,作為中間類@Overridepublic void 打坐() { //重寫 和尚 這個接口里面的所有抽象方法,但是都是空方法,調用空方法是沒有任何意義的}@Overridepublic void 念經() {}@Overridepublic void 撞鐘() {}@Overridepublic void 習武() {}}
class 魯智深 extends 天罡星{ //魯智深 這個類去繼承 天罡星 這個抽象類public void 習武() {System.out.println("倒拔垂楊柳");System.out.println("拳打鎮關西");System.out.println("大鬧野豬林");System.out.println("......");}//這里并沒有重寫toString方法,而是采用 類名. 的方法調用類中的每個方法
}
class 唐三藏 extends 天罡星{public void 打坐(){System.out.println("我佛慈悲");}public void 念經() {System.out.println("阿彌陀佛");}public void 撞鐘() {System.out.println("duangduangduang");}
}