JavaFX에 리스너가 있다는 것을 알고 있으며 Java라고 확신합니다. 그러나 나는 그것을 구현하는 방법으로 혼란 스럽다.변수 변경시 호출되는 Java/JavaFX의 변수에 리스너 추가
내 프로그램에서 변경되는 부울 변수가 있습니다. 부울이 변경 될 때마다 함수 myFunc()가 실행되기를 원합니다.
쉽게 할 수 있습니까? 이 같은
JavaFX에 리스너가 있다는 것을 알고 있으며 Java라고 확신합니다. 그러나 나는 그것을 구현하는 방법으로 혼란 스럽다.변수 변경시 호출되는 Java/JavaFX의 변수에 리스너 추가
내 프로그램에서 변경되는 부울 변수가 있습니다. 부울이 변경 될 때마다 함수 myFunc()가 실행되기를 원합니다.
쉽게 할 수 있습니까? 이 같은
로 간단한 :
public void changeBooleanFlag(boolean bEnabled)
{
if(booleanFlag == bEnabled) return;
booleanFlag = bEnabled;
myFunc();
}
을하고 부울 플래그를 변경할 때마다, 당신은 는이 방법을 통해 그것을해야한다.
이 대답의 솔루션을 사용하고 여러 스레드에서이 프로 시저에 액세스하는 경우 확실하게 일부 동기화 메커니즘을 구현해야합니다. –
이이 경우에, 당신은 당신의 빈에 리스너를 추가하며, 일반 자바를 사용하여 문제
첫 번째 솔루션에 대한 자세한 내용은 JavaBeans 사양 및 샘플을 참조하십시오. –
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..
}
}
당신은 자바 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);
}
}
나는 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