gpt4 book ai didi

java - 通过键绑定(bind)到 ObservableMap 的值

转载 作者:行者123 更新时间:2023-12-04 03:14:57 26 4
gpt4 key购买 nike

JavaFX 是否有一种绑定(bind)类型,在这种绑定(bind)类型中,我提供一个带有键的可观察映射,并且计算值将始终随着键/值对的变化而更新?从 map 中删除该键将导致 null值,将其加回去将跟踪该值。

我一直在查看 JavaDoc 并找到了 MapProperty , MapBindingObservableMapValue , 但似乎没有什么能达到这个目的。

我已经设计了自己的变体,但我想使用一个相当安全且经过测试的版本。

最佳答案

你可以这样做

someObjectProperty.bind(Bindings.createObjectBinding(
() -> myObservableMap.get(key), myObservableMap);

或者,正如@VGR 在评论中指出的那样

someObjectProperty.bind(Bindings.valueAt(someObservableMap, key));

这是使用第二种方法的 SSCCE:

import java.util.Arrays;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableMap;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class BindToObservableMap extends Application {

private static final String[] keys = {"key1", "key2", "key3"};

@Override
public void start(Stage primaryStage) {
ObservableMap<String, String> map = FXCollections.observableHashMap();
for (String k : keys) map.put(k, k.replaceAll("key", "value"));

GridPane grid = new GridPane();
grid.setHgap(5);
grid.setVgap(5);
grid.setPadding(new Insets(10));
for (int i = 0 ; i < keys.length; i++) {
grid.add(new Label(keys[i]), 0, i);
Label boundLabel = new Label();
boundLabel.textProperty().bind(Bindings.valueAt(map, keys[i]));
grid.add(boundLabel, 1, i);
}

ComboBox<String> keyCombo = new ComboBox<>();
keyCombo.getItems().setAll(keys);
TextField valueField = new TextField();
Button update = new Button("Update");
EventHandler<ActionEvent> handler = e -> {
map.put(keyCombo.getValue(), valueField.getText());
valueField.clear();
keyCombo.requestFocus();
};
valueField.setOnAction(handler);
update.setOnAction(handler);

grid.addRow(keys.length, keyCombo, valueField);
grid.add(update, 0, keys.length + 1);

Scene scene = new Scene(grid);
primaryStage.setScene(scene);
primaryStage.show();
}

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

关于java - 通过键绑定(bind)到 ObservableMap 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com