Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как в JavaFX 2 верно сделать data binding?

Anna | 5.06.2014 | нет комментариев

Я редко тружусь с client-side, может следственно появилась такая задача.
Выходит, какие вероятности по data binding я обнаружил в java fx:
1. Через ChangeListener:

    @FXML
    private TextField firstNameField;

    private Person person;

    public void initialize(final URL arg0, final ResourceBundle arg1) {
        firstNameField.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(final ObservableValue<? extends String> paramObservableValue,
                    final String paramT1, final String paramT2) {
                person.setFirstName(paramT2);
            }
        });
    }

В этом случае мы получаем громоздний и никому непотребный код одностороннюю связь (мы слушаем только метаморфозы с UI)

2. Через проперти:

    @FXML
    private TextField firstNameField;
    private final StringProperty firstName = new SimpleStringProperty(this, "firstName");

    public void initialize(final URL arg0, final ResourceBundle arg1) {
        Bindings.bindBidirectional(firstNameField.textProperty(), firstName);
    }

Здесь все прекрасно. Но! У меня есть POJO объект Person, как это значение попадет в него? Т.е. мне нужно для всякого поля всякой модели пересетывать значения, вначале в одну сторону (что бы отобразить поля модели), после этого в иную (что бы внести метаморфозы в модель)? Какой тогда в этом толк, если с тем же триумфом я могу верно так же вытянуть значения из текстовых филдов (тем больше, что они все тоже обязаны быть в контроллере, что бы сделать байндинг)?

3. Запихнуть проперти в класс модели, и дальше как в #2.

public class Person {
    private StringProperty firstName = new SimpleStringProperty(this, "firstName", "");
    public final String getFirstName() { return firstName.get(); }
    public final void setFirstName(String value) { firstName.set(value); }
    public final StringProperty firstNameProperty() { return firstName; }
}

Это решает загвоздку, описанную в #2, но при этом каверкает класс модели… Хотелось бы оставить их POJO.

Что хотелось бы видеть: в контроллер приходит объект модели, мы пихаем его в какую то обертку, которая байндит эту модель на TextField’ы и другие контролы. Пускай даже байндинг нужно будет очевидно объявлять:

    public void initialize(final URL arg0, final ResourceBundle arg1) {
        Bindings.bindBidirectional(firstNameField.textProperty(), personWrapper.getProperty("firstName"));
    }

Может быть что то сходственное все-таки есть?

Обособленный вопрос появился про маппинг поля с типом enum на группу RadioButton’ов… Без танцев с бубном мне этого сделать не получилось… Правда, казалось бы, все довольно легко. Сделать EnumProperty и рулить все через ToggleGroup… И такое средство хотелось бы иметь из коробки, а не писать велосипеды…

Буду признателен любым конструктивным результатам.

Сотрудники, если Вы уж минусуете, хоть поясняйте, в чем повод. Что бы была вероятность поправить косяки. Спасибо.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB