JavaFXにリスナーがあることはわかっていますが、Javaは確信しています。しかし、私はそれらを実装する方法として混乱しています。変数変更時に呼び出されるJava/JavaFXの変数にリスナーを追加する
私はプログラム全体で変更されるブール変数を持っています。ブール値が変更されるたびに、関数myFunc()を実行します。
これは簡単に行うことができますか?このような単純な
JavaFXにリスナーがあることはわかっていますが、Javaは確信しています。しかし、私はそれらを実装する方法として混乱しています。変数変更時に呼び出されるJava/JavaFXの変数にリスナーを追加する
私はプログラム全体で変更されるブール変数を持っています。ブール値が変更されるたびに、関数myFunc()を実行します。
これは簡単に行うことができますか?このような単純な
:
public void changeBooleanFlag(boolean bEnabled)
{
if(booleanFlag == bEnabled) return;
booleanFlag = bEnabled;
myFunc();
}
、あなたはブールフラグを変更したい時はいつでも、あなたはははこの方法でそれを行う必要があります。
この回答の解決策を使用し、複数のスレッドからこの手順にアクセスする場合は、間違いなくいくつかの同期メカニズムを実装する必要があります。 –
問題プレーンJavaを使用した
JavaBeansの仕様とサンプルを最初に見てみましょう。 –
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..
}
}
あなたは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);
}
}
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);
}
}
あなたは私たちにいくつかのコードを示してもらえますか?私はあなたが求めていることは可能だとは思わないが、同じ効果を別の方法で達成することができる。 – chandsie