在javafx场景中,我有:
以某些语言环境作为项目的组合框
具有条目(语言环境,字符串)的哈希表
用于显示和编辑文本的文本字段
我想做的是:
更改区域组合框时,textield根据所选位置显示存储在哈希表中的文本。示例1:如果选择frech,则文本字段显示“ french text”。示例2:如果选择了中文,则文本字段不会显示任何内容(哈希表不包含zh键)。
由于在文本字段中键入了一些文本,因此哈希表将使用组合框中选择的语言环境执行放置操作。示例1:如果键入“ aaa”并选择了French,则哈希表用文本“ aaa”修改条目fr。示例2:如果键入了'bbb'并且选择了中文,则hastable添加条目(zh,'bbb')。示例3:如果textfiled没有文本并且选择了英语,则哈希表将删除en条目。
最初,哈希表没有空字符串,并且组合框始终选择了一个位置。有可能做到这一点吗?
答案 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;
}
}