2012-04-01 5 views
7

JavaFXにリスナーがあることはわかっていますが、Javaは確信しています。しかし、私はそれらを実装する方法として混乱しています。変数変更時に呼び出されるJava/JavaFXの変数にリスナーを追加する

私はプログラム全体で変更されるブール変数を持っています。ブール値が変更されるたびに、関数myFunc()を実行します。

これは簡単に行うことができますか?このような単純な

+0

あなたは私たちにいくつかのコードを示してもらえますか?私はあなたが求めていることは可能だとは思わないが、同じ効果を別の方法で達成することができる。 – chandsie

答えて

4

public void changeBooleanFlag(boolean bEnabled) 
{ 
    if(booleanFlag == bEnabled) return; 
    booleanFlag = bEnabled; 
    myFunc(); 
} 

、あなたはブールフラグを変更したい時はいつでも、あなたははこの方法でそれを行う必要があります。

+3

この回答の解決策を使用し、複数のスレッドからこの手順にアクセスする場合は、間違いなくいくつかの同期メカニズムを実装する必要があります。 –

0

問題プレーンJavaを使用した

  1. ための2つのソリューションがありますが、その場合には、自分で再び((自分で)あなたのBeanにリスナーを追加し、setterメソッドのリスナーメソッドを呼び出すもの)、変数をプライベートにしてください。これは、セッターメソッドでのみ変更できます。
  2. 2番目の解決策は、純粋なAOPフレームワークを使用しています(私はAspectJがこれを行うことができます)、あなたの変数の変更を傍受して、アスペクトを使ってリスナーに電話をかけることができます。 @AspectJ(AspectJのアノテーションサポート)を使用すると、あなたの側面は純粋なJavaクラスであり、AspectJサポートIDEは必要ありません。
+0

JavaBeansの仕様とサンプルを最初に見てみましょう。 –

0

UはObserverデザインパターンを使用できます。ただ、このような :

public interface Listener 
    { 
     public void handle(Object o) ; 
    } 

    public class PropertiesChangeListener 
    { 
     public void handle(Object o) { 
     //DO SOMETHING... 
     } 
    } 

    public class Bean { 
     private boolean flag; 
     private List<Listener> listeners = new ArrayList<Listener>(); 

     public setFlag(boolean flag) { 
     this.flag = flag; 
     if (listeners.size() > 0) { 
      for (Listener l : this.listeners) { 
       l.handle(flag); //invoke 
      } 
     } 
     } 

     public registerListener(Listener listener) { 
     this.listeners.add(listener); 
     } 

     //..... other fields and methods 

    } 

    public class Main{ 

     public static void main(String[] args) { 
     Bean bean = new Bean(); 
     bean.registerListener(new PropertiesChangeListener()); 
     bean.setFlag(true); //handler method will be invoked.. 
     } 
    } 
22

あなたはJavaFXの2を使用している場合、それは、JavaBeansコンポーネントアーキテクチャとオブザーバーデザインパターンの両方のためのアウトオブボックスソリューションを提供しています。さらに、変数の状態をプロパティーバインディングと関連付けることの大きな柔軟性を提供します。以下のコードは、プロパティ変更イベントとプロパティ変数のバインドを示しています。もちろん、プロパティアクセサーをラップして、下のgetFlag()setFlag()のように細部を隠し、残りのアプリケーションで使用することができます。

public class Demo extends Application { 

    private BooleanProperty booleanProperty = new SimpleBooleanProperty(true); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     // Add change listener 
     booleanProperty.addListener(new ChangeListener<Boolean>() { 

      @Override 
      public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
       System.out.println("changed " + oldValue + "->" + newValue); 
       myFunc(); 
      } 
     }); 

     Button btn = new Button(); 
     btn.setText("Toggle boolean flag"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       booleanProperty.set(!booleanProperty.get()); //toggle 
       System.out.println("toggled to " + booleanProperty.get()); 
      } 
     }); 

     // Bind to another property variable 
     btn.underlineProperty().bind(booleanProperty); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public boolean getFlag() { 
     return booleanProperty.get(); 
    } 

    public void setFlag(boolean val) { 
     booleanProperty.set(val); 
    } 
} 
2

PropertyChangeListenerを使用します。ここで素敵なチュートリアルです:コードのhttp://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

例:

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.List; 

public class MyClass { 
    private final List<PropertyChangeListener> listeners = new ArrayList<>(); 
    private boolean b1, b2; 

    public MyClass() { 
    } 

    public boolean isB1() { 
     return b1; 
    } 

    public void setB1(boolean b1) { 
     boolean oldValue = this.b1; 
     this.b1 = b1; 
     firePropertyChange("b1", oldValue, b1); 
    } 

    public boolean isB2() { 
     return b2; 
    } 

    public void setB2(boolean b2) { 
     boolean oldValue = this.b2; 
     this.b2 = b2; 
     firePropertyChange("b2", oldValue, b2); 
    } 

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

    private void firePropertyChange(String property, Object oldValue, Object newValue) { 
     for (PropertyChangeListener l : listeners) { 
      l.propertyChange(new PropertyChangeEvent(this, property, oldValue, newValue)); 
     } 
    } 

    /** 
    * Main method for tests. 
    * @param args 
    */ 
    public static void main(String[] args) { 
     MyClass m = new MyClass(); 

     m.addPropertyChangeListener(new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       String changedProperty = e.getPropertyName(); 
       System.out.println("Changed property: " + changedProperty); 
       System.out.println("New value: " + e.getNewValue()); 
       System.out.println("Old value: " + e.getOldValue()); 
       System.out.println(); 
      } 
     }); 

     m.setB1(true); 
     m.setB2(false); 
    } 
} 
関連する問題