[プラグイン開発] --11(-GEFの原理を説明するためのJavaイベントリスナー例)耳

上記のレビュー:

プラグイン学習の記事

シンプルなプラグイン確立エンジニアリング、解析モデルファイル

拡張ポイントを使用して、開発パースペクティブ

SWTプログラミングノート

シンプルなレイアウトSWTとコントロールを使用

スペースとレイアウトを持つSWT複合体

7件の  SWTのレイアウトコメント

IPreferenceStoreは、詳細な使用しています

エディタのコードカラーリング

10 JFaceの開発

  イベントを監視し、それは、プラグイン開発の重要な一部であり、すべてのクリックやキーイベントは、それを達成するためにどのようにして、いくつかの種類の応答を誘発する可能性が高いですか?

  監視されているいくつかのモデルでは、通常、あなたが必要とするモニター・キューを追加します

  リスナーは、いくつかの方法必要なモニター・キューに追加します

  特定の状況下でモデルときにイベントリスナーをトリガが応答するよう、それは、イベントに応答して生成する各リスナーのキューを聞く操作に応答してトリガされます

  例えば、小さな例を次に示します。

class FocusedCountry{
    List<IListener> listener = new ArrayList();
    public void addListener(IListener lis){
        listener.add(lis);
    }
    //移除监听者
    public void removeListener(IListener lis){
        listener.remove(lis);
    }
    //触发监听事件
    protected void fireChange(String message){
        for(IListener lis : listener){
            lis.noticedChange(message);
        }
    }
}

  監視されているオブジェクトは、リスニングキューがあり、それに興味を持ってすべての人々は、モニター・キューに追加されます。従って三つの主要な機能があり、キューから離れるキュー、およびトリガ機能自体に加えました。

interface IListener{
    public void noticedChange(String message);
}

class DevelopedCountry implements IListener{
    public void noticedChange(String message) {
        System.out.println("noticed the change:"+message);
    }
}

  上記リスナーインタフェースを実装する限り、クラスがインターフェイスを実装するように、キューに追加することができます。

public class ListenTest {
    public static void main(String[] args) {
        DevelopedCountry America = new DevelopedCountry();
        FocusedCountry China = new FocusedCountry();
        FocusedCountry NorthKorea = new FocusedCountry();
        China.addListener(America);
        NorthKorea.addListener(America);
        China.fireChange("登月!");
        NorthKorea.fireChange("原子弹造好了,该去哪扔呢!");
    }
}

  以下の結果を呼び出して、すべてのイベントは、リスナーによって受信されます。

noticed the change:登月!
noticed the change:原子弹造好了,该去哪扔呢!

 

  GEFは、それを使用する方法、その後のですか?

  GEFは、標準的なMVCアーキテクチャで、そのモデルは聞くキューを実装するための責任があり、そしてコントロールがリッスンを受信するための責任がある、ビューモデルを変更する応答

  このように、一般的に、モデルは、仮想カスタムクラスを継承し、このクラスは、仮想キューリスナーが含まれており、機能の上記3種類。

public class AbstractModel implements Serializable{
 
 private PropertyChangeSupport listeners = new PropertyChangeSupport(this);

 public void addPropertyChangeListener(PropertyChangeListener listener) {
  listeners.addPropertyChangeListener(listener);
 }

 public void firePropertyChange(String propName, Object oldValue,Object newValue) {
  listeners.firePropertyChange(propName, oldValue, newValue);
 }

 public void removePropertyChangeListener(PropertyChangeListener listener) {
  listeners.removePropertyChangeListener(listener);
 }
}

  このクラスを継承した後、あなたが特定のイベントをトリガーに耳を傾ける必要があり、通常の状況下では、モデルは、プロパティの一部に対応するビュー、ビューは、プロパティIPropertySourceインターフェイスを継承する必要があります。そして、次のメソッドをオーバーライドします。

public IPropertyDescriptor[] getPropertyDescriptors() {
  return new IPropertyDescriptor[] {
    new PropertyDescriptor(P_TABLE_NAME, "table_name"),
 }

 public Object getPropertyValue(Object id) {
  if (id == P_TABLE_NAME) {
   return getPhysicalName();
  }
  return null;
 }


 public boolean isPropertySet(Object id) {
  if (id == P_TABLE_NAME) {
   return true;
  }
  return false;
 }


 public void setPropertyValue(Object id, Object value) {
  if (id == P_TABLE_NAME) {
   seName((String) value);
  }
 }

  設定値がなfirePropertyChange関数内listnersにこのfirechange、最後のトリガーをトリガーする際のプロパティのプロパティは、通常は、変更内容を表示します。

public void setXXXlName(String xxxName) {
      this.xxxName = xxxName;
      firePropertyChange(P_XXX_NAME, null, xxxName);
 }

  ここでは、静的な文字列を使用する各イベントのプラグイン開発のレガシー習慣がマークされています。機能はのPropertyChangeのイベントを生成します。

  取得するには、モデルのような部分を監視し、それがリスナーのことを次のように追加することです。

  ここで、リスナーは、のPropertyChangeListenerインタフェースを実装する必要があり、適切な時間は、コード内のEditPartのこの部分のため、キューを監視するために追加され、それは対応得ることができる簡単なgetModel法により、各EditPartのモデルに対応GEFモデルオブジェクトは、そのオブジェクトモデルとのaddListenerを聞いてキューに追加され、他の方法を呼び出す OK上でを。

public void activate() {
  if (isActive()) {
   return;
  }
  super.activate();
  ((TableModel) getModel()).addPropertyChangeListener(this);
 }

 public void deactive() {
  if (!isActive()) {
   return;
  }
  super.deactivate();
  ((TableModel) getModel()).removePropertyChangeListener(this);
 }

  これらの機能の実装に一般に位置コンストラクタとデストラクタ関数に対応するように、一般的に、この2つの機能があります。

  キューリスナーを添加した後、上記のパラメータの文字列を渡すのPropertyChangeメソッド内PropertyChangeListenerを達成するために約必要性は、モデルに応じて発生した時間を決定するために、最初に設定されたパラメータによって得ることができます。

public void propertyChange(PropertyChangeEvent evt) {
  if (evt.getPropertyName().equals(TableModel.P_TABLE_NAME))
   refreshVisuals();
   ... 
 }

 

ます。https://my.oschina.net/u/204616/blog/545361で再現

おすすめ

転載: blog.csdn.net/weixin_34179968/article/details/91989315