2012-04-01 2 views
7

JavaFX에 리스너가 있다는 것을 알고 있으며 Java라고 확신합니다. 그러나 나는 그것을 구현하는 방법으로 혼란 스럽다.변수 변경시 호출되는 Java/JavaFX의 변수에 리스너 추가

내 프로그램에서 변경되는 부울 변수가 있습니다. 부울이 변경 될 때마다 함수 myFunc()가 실행되기를 원합니다.

쉽게 할 수 있습니까? 이 같은

+0

당신이 우리에게 몇 가지 코드를 보여줄 수 여기에 좋은 튜토리얼? 나는 당신이 요구하는 것이 가능하다고 생각하지만 같은 효과는 다른 방식으로 성취 될 수 있습니다. – chandsie

답변

4

로 간단한 :

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

을하고 부울 플래그를 변경할 때마다, 당신은 이 방법을 통해 그것을해야한다.

+3

이 대답의 솔루션을 사용하고 여러 스레드에서이 프로 시저에 액세스하는 경우 확실하게 일부 동기화 메커니즘을 구현해야합니다. –

0

이이 경우에, 당신은 당신의 빈에 리스너를 추가하며, 일반 자바를 사용하여 문제

  1. 2 개 솔루션 (스스로) 된 후 스스로 다시 setter 메소드 (에 리스너 메소드를 호출), 변수 을 개인으로 설정하여 설정 메소드로만 수정할 수 있습니다.
  2. 두 번째 솔루션은 순수한 AOP 프레임 워크를 사용하고 있습니다 (AspectJ가이를 수행 할 수 있음을 알고 있습니다). 변수의 수정을 가로 채고 측면을 사용하여 리스너를 호출 할 수 있습니다. @AspectJ (AspectJ의 주석 지원)를 사용하면 순수한 Java 클래스가 될 것이고 AspectJ 지원 IDE는 필요 없다고 언급하겠다.
+0

첫 번째 솔루션에 대한 자세한 내용은 JavaBeans 사양 및 샘플을 참조하십시오. –

0

U는 옵서버 디자인 패턴을 사용할 수 있습니다. 다만이 같은 :

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

당신은 자바 FX이 사용하는 다음 자바 빈즈 컴포넌트 아키텍처와 관찰자 디자인 패턴 모두 아웃 - 오브 - 박스 솔루션을 제공합니다. 또한 변수 바인딩을 속성 바인딩과 연결하는 유연성이 뛰어납니다. 아래 코드는 속성 변경 이벤트와 속성 변수의 바인딩을 보여줍니다. 물론 아래의 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); 
    } 
}