Java 复杂的约束情况

Java 复杂的约束情况,java,binding,javafx-8,Java,Binding,Javafx 8,在javafx场景中,我有: 包含某些区域设置作为项目的组合框 包含条目(区域设置、字符串)的哈希表 显示和编辑文本的文本字段 我想做的是: 当locale组合框更改时,textField根据locate selected显示存储在哈希表中的文本。示例1:如果选择frech,textfield将显示“法语文本”。示例2:如果选择了中文,textfield不会显示任何内容(哈希表不包含zh键) 当在textfield中键入某些文本时,hashtable将使用combobox中选择的区域设置

在javafx场景中,我有:

  • 包含某些区域设置作为项目的组合框

  • 包含条目(区域设置、字符串)的哈希表

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

我想做的是:

  • 当locale组合框更改时,textField根据locate selected显示存储在哈希表中的文本。示例1:如果选择frech,textfield将显示“法语文本”。示例2:如果选择了中文,textfield不会显示任何内容(哈希表不包含zh键)

  • 当在textfield中键入某些文本时,hashtable将使用combobox中选择的区域设置执行put。示例1:如果键入了“aaa”并选择了法语,则哈希表将用文本“aaa”修改条目fr。示例2:如果键入了“bbb”并选择了中文,则hastable将添加条目(zh,'bbb')。示例3:如果TextField没有文本,并且选择了english,hashtable将删除en条目


最初,哈希表没有空字符串,combobox总是选择一个locate。有可能实现这一点吗?

通过在
哈希表中使用
字符串
对象,您不能使用任何
属性的绑定方法与之交互,但您仍然可以通过在这些属性上使用侦听器来实现您的目标。下面是一个粗略的例子:

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;
    }

}
公共类控制器{
私有VBox base=new VBox();
私有ComboBox ComboBox=新ComboBox();
private TextField TextField=new TextField();
私有按钮=新按钮(“打印”);
私有哈希表映射=新哈希表();
公共VBox getBase(){
返回基地;
}
公共控制员(){
setupUi();
附加条款(“中文”);
附加条款(“法语”);
附加条款(“英文”);
comboBox.getItems().add(新语言环境(“俄罗斯”、“一些俄罗斯文本”);
comboBox.getSelectionModel().SelectEditeProperty()
.addListener((obs,oldVal,newVal)->textField.setText(map.get(newVal));
textField.textProperty().addListener((obs,oldVal,newVal)->{
if(newVal==null | | newVal.equals(“”){
remove(comboBox.getValue());
}否则{
map.put(comboBox.getValue(),newVal);
}
});
comboBox.getSelectionModel().selectFirst();
}
私有void setupUi(){
base.getChildren().addAll(组合框、文本字段、按钮);
按钮.setOnAction(事件->系统.out.println(映射));
}
专用void addItem(字符串名称){
语言环境=新的语言环境(名称,String.format(“某些%s文本”,名称));
map.put(locale,locale.text);
comboBox.getItems().add(区域设置);
}
}
类区域设置{
字符串名;
字符串文本;
区域设置(字符串名称、字符串文本){
this.name=名称;
this.text=文本;
}
@凌驾
公共字符串toString(){
返回名称;
}
}

您可以在属性之间进行绑定,因为
Hashtable
不是
javafx.beans.property.property
您希望如何实现这一点?