复杂的绑定情况

时间:2018-11-07 20:39:15

标签: java binding javafx-8

在javafx场景中,我有:

  • 以某些语言环境作为项目的组合框

  • 具有条目(语言环境,字符串)的哈希表

  • 用于显示和编辑文本的文本字段

enter image description here

我想做的是:

  • 更改区域组合框时,textield根据所选位置显示存储在哈希表中的文本。示例1:如果选择frech,则文本字段显示“ french text”。示例2:如果选择了中文,则文本字段不会显示任何内容(哈希表不包含zh键)。

  • 由于在文本字段中键入了一些文本,因此哈希表将使用组合框中选择的语言环境执行放置操作。示例1:如果键入“ aaa”并选择了French,则哈希表用文本“ aaa”修改条目fr。示例2:如果键入了'bbb'并且选择了中文,则hastable添加条目(zh,'bbb')。示例3:如果textfiled没有文本并且选择了英语,则哈希表将删除en条目。

最初,哈希表没有空字符串,并且组合框始终选择了一个位置。有可能做到这一点吗?

1 个答案:

答案 0 :(得分:1)

通过在String中使用Hashtable对象,您不能使用任何Property的绑定方法与之交互,但是您仍然应该能够通过使用侦听器来实现目标在这些属性上。这是一个粗略的示例:

public class Controller {

    private VBox base = new VBox();
    private ComboBox<Locale> comboBox = new ComboBox<>();
    private TextField textField = new TextField();
    private Button button = new Button("Print");

    private Hashtable<Locale, String> map = new Hashtable<>();

    public VBox getBase() {
        return base;
    }

    public Controller() {
        setupUi();

        addItem("Chinese");
        addItem("French");
        addItem("English");
        comboBox.getItems().add(new Locale("Russia", "Some Russian Text"));

        comboBox.getSelectionModel().selectedItemProperty()
                .addListener((obs, oldVal, newVal) -> textField.setText(map.get(newVal)));

        textField.textProperty().addListener((obs, oldVal, newVal) -> {
            if (newVal == null || newVal.equals("")) {
                map.remove(comboBox.getValue());
            } else {
                map.put(comboBox.getValue(), newVal);
            }
        });

        comboBox.getSelectionModel().selectFirst();
    }

    private void setupUi() {
        base.getChildren().addAll(comboBox, textField, button);
        button.setOnAction(event -> System.out.println(map));
    }

    private void addItem(String name) {
        Locale locale = new Locale(name, String.format("Some %s text", name));
        map.put(locale, locale.text);
        comboBox.getItems().add(locale);
    }

}


class Locale {

    String name;
    String text;

    Locale(String name, String text) {
        this.name = name;
        this.text = text;
    }

    @Override
    public String toString() {
        return name;
    }

}