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