Сложная обязательная ситуация - PullRequest
0 голосов
/ 07 ноября 2018

В сцене javafx у меня есть:

  • Комбо-ящик с некоторыми локалями в качестве элементов

  • Хеш-таблица с записями (Locale, String)

  • Текстовое поле для отображения и редактирования текста

enter image description here

Что я хочу сделать, это:

  • При изменении комбинированного списка локали текстовое поле показывает текст, сохраненный в хеш-таблице в соответствии с выбранным местоположением. Пример 1: если выбран frech, в текстовом поле отображается «французский текст». Пример 2: если выбран китайский, в текстовом поле ничего не отображается (в хеш-таблице нет клавиши zh).

  • Поскольку некоторый текст набирается в текстовом поле, hashtable выполняет вставку с выбранным языком в выпадающем списке. Пример 1: если набрано 'aaa' и выбран французский, hashtable измените запись fr с текстом 'aaa'. Пример 2: если напечатано «bbb» и выбран китайский язык, hastable добавьте запись (zh, «bbb»). Пример 3: если в textfiled нет текста и выбран английский язык, хеш-таблица удаляет запись en.

Изначально в хеш-таблице не было пустых строк, а в выпадающем списке всегда был выбран locate. Можно ли этого добиться?

1 Ответ

0 голосов
/ 09 ноября 2018

Используя 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;
    }

}
...