2017年4月30日 星期日

JAVA界面,如何設計界面含傾聽事件

常常用到實作Java API已寫好的界面,可是都從沒實際設計界面含傾聽事件,現在就來說要如何弄出可時時發送資料的界面,讓其他類監聽,取得資料

下面程式是大致的流程,interface_A類,設計界面data_change_lister被監聽類實作,含有一方法void capture_data_change(int data)要被監聽類實作的方法,其中data是我們要被其他監聽類,監聽的資料,void set_data_change_lister(data_change_lister lister)這個可指定其他監聽類來傾聽
,透過mlister.capture_data_change(i)來發送資料.

當然要達到像下面不同類傳送資料,不用界面也可,但都要在類內實例化其他監聽類,在送出資料,程式碼顯得很亂,透過界面不須實例化監聽類,界面類根本不需要考慮是任何類來監聽資料,變得有規律,透過界面更為周詳,更有彈性,譬如在遊戲中做幾拾個甚至幾百個物體碰撞判別,之前文章python gtk cairo射擊小遊戲,也有類似方法,不過有些時間忘了是如何實現的,要回去看程式碼才知道.

簡單說java 的界面類,不需實例化監聽類,只需指定界面變數,透過界面實例化該監聽類成員,不需要管監聽成員的類別,若不用界面也可以,但實例化必須是該監聽類,才能對該監聽類發送資料,以前我都是用後者來發送.

注意下面紅色粗體字mlister是界面變數,但在set_data_change_lister,卻是可以指定任何類成為這個界面變數,原因在監聽類implements後就可變成該界面型態,而被當引數指成改界面變數mlister,呼叫本身的實作方法mlister.capture_data_change(i),就可取得該i資料了,若界面類是一個Thread,將傳送資料放在run()方法中while(){傳送資料},start()後可持續監聽該資料

主Class 監聽類B:

Class B宣告實作interface_A.data_change_lister,實例化interface_A,加入事件傾聽者minterface_A.set_data_change_lister(this)
實作capture_data_change(int data)監聽了data,start thread結果會在terminal印出0 1 2 3 4 5 6 7 8 9

//Class B宣告實作interface_A.data_change_lister
public class B implements interface_A.data_change_lister{

   public B(){
     //實例化interface_A
     interface_A minterface_A=new interface_A();
     //加入事件傾聽者
    minterface_A.set_data_change_lister(this);
    //start thread
    minterface_Aminterface_A.start()
   }
   @Override
    public void capture_data_change(int data){
        //時時傾聽data變化
        Log.d("TAG_DATA","Data change: "+data);
    }
}

界面類interface_A:注意這裡沒實例化CLass B,是透過界面來實例化任何監聽類
//Class interface_A設計界面data_change_lister
public class interface_A extends Thread{
    //這裡指定界面變數,用來接受監聽類成員
    private data_change_lister mlister;
    //建構子
    public interface_A(){..........}
    @Overrid
    public void run(){
    //舉例傳送0 1 2 3 4 5 6 7 8 9資料
     if(mlister!=null)
         {
                 //透過介面mlister變數給事件傾聽者傳送資料
                 for(int i=0;i < 10;i++){
                    mlister.capture_data_change(i);
                   }
         }
         
    }
 
    //關鍵在這界面變數,可以設定是任何類,設定mlister變數成為其他監聽類實例化
    public void set_data_change_lister(data_change_lister lister){
         mlister=lister;
         Log.d("TAG_DATA","set listener "+mlister);
    }
    //設計data_change_lister界面
    public interface data_change_lister{
        //資料變化時,捕捉資料data
        void capture_data_change(int data);
    }
}


沒有留言: