将侦听器添加到Java/JavaFX中的变量,该变量在变量变量时被调用

CRE*_*REW 8 java javafx actionlistener

我知道JavaFX中有听众,我确信Java.但我很困惑如何实现它们.

我有一个在我的程序中改变的布尔变量.每次更改布尔值时,我都希望运行一个函数myFunc().

这可以轻松完成吗?

Ulu*_*Biy 24

如果您使用的是JavaFX 2,那么它为JavaBeans组件体系结构和Observer设计模式提供了现成的解决方案.此外,它提供了通过属性绑定关联变量状态的极大灵活性.下面的代码说明了属性更改事件和属性变量的绑定.当然,您可以通过like getFlag()setFlag()below 包装属性访问器来隐藏详细信息,并在其余的应用程序中使用它们.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Eng*_*uad 4

就这么简单:

public void changeBooleanFlag(boolean bEnabled)
{
    if(booleanFlag == bEnabled) return;
    booleanFlag = bEnabled;
    myFunc();
}
Run Code Online (Sandbox Code Playgroud)

每当你想改变布尔标志时,你应该通过这个方法来完成。

  • 如果您使用这个答案的解决方案,并且如果您从多个线程访问此过程,那么您肯定想要实现一些同步机制。 (3认同)