JavaFx的属性、集合绑定事件(十一)

JavaFx的属性、集合绑定事件(十一)

JavaFx从入门到入土系列
JavaFX属性存储控件的内部状态,并允许我们监听来自变量的状态更改。JavaFX属性可以彼此绑定。绑定行为允许属性根据来自另一个属性的更改值来同步其值。

相互绑定可根据下面的思路去实现

监听基本类型

变动监听 还有 SimpleStringProperty、SimpleObjectProperty 等等基本类型

public class Test04 extends Application {

    private Integer num = 1;

    @Override
    public void start(Stage stage) throws Exception {
        Label label = new Label("hello world!");
        Scene scene = new Scene(label);
        stage.setScene(scene);
        stage.setWidth(400);
        stage.setHeight(400);
        stage.setTitle("师姐,你好!");
        stage.show();

        // 变动监听 还有 SimpleStringProperty、SimpleObjectProperty 等等基本类型
        SimpleIntegerProperty property = new SimpleIntegerProperty(0); // 初始值为0
        property.addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number t1) {
                System.out.println("变量改变了:" + observableValue);
                // 在此可以更新主线程UI
                label.setText(observableValue.getValue().toString());
            }
        });

        // 添加一个点击事件改变变量值
        label.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                num++;
                property.set(num);
            }
        });
    }

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

这里你是不是想到了异步请求时,用于监听某个变量的变化来达到监听异步请求结果的事件呢?实际上这样也是行得通的。毕竟异步更新UI的方式有很多。

集合绑定

javaFx提供了集合绑定的,下面举例list和map

List

        // list 监听
        ObservableList<Integer> list = FXCollections.observableArrayList(new ArrayList<>());//初始值为空数组 ArrayList
        list.addListener(new ListChangeListener<Integer>() {
            @Override
            public void onChanged(Change<? extends Integer> change) {
                // 在此可以更新主线程UI
                label.setText(change.toString());
                System.out.println(list.toString());
            }
        });

        // 添加一个点击事件改变变量值
        label.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                num++;
                list.add(num);
            }
        });

效果如下:
在这里插入图片描述

Map

		ObservableMap<String,Integer> mapObservable=FXCollections.observableMap(new HashMap<>());
        mapObservable.addListener(new MapChangeListener<String, Integer>() {
            @Override
            public void onChanged(Change<? extends String, ? extends Integer> change) {
                // 在此可以更新主线程UI
                label.setText(change.toString());
                System.out.println(mapObservable.toString());
            }
        });

        // 添加一个点击事件改变变量值
        label.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                num++;
                mapObservable.put("key_"+num,num);
            }
        });

效果如下:
在这里插入图片描述

其他变量

还有很多类型的监听,这里不一一举例,下面是哪些类型的源码截图
基本:
在这里插入图片描述

集合:
在这里插入图片描述

posted @ 2022-09-16 00:08  凌康  阅读(318)  评论(0编辑  收藏  举报