Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / подскажите по javafx / 12 сообщений из 12, страница 1 из 1
18.12.2014, 13:57
    #38837003
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
Решил в своём проекте сделать отдельную тулзу на javafx.
Читаю мануалы и всякие туториалы и не могу понять вот какую вещь:
если у меня уже есть некая объектная модель, которую мне нужно редактировать и сохранять в БД, то мне нужно создать для каждого своего класса обёртку с пропертями для биндинга, и потом как-то эту химеру превращать в свой оригинальный класс?

Или же в таком случае всё по старинке? навводили в форму данных, по кнопке сграбили из всех полей в соответствующие поля объекта и сохранили в БД? Тогда получаю проблему с отображением всяких ListView и TableView.

Хочется сделать всё по уму [spoiler] youtube
YouTube Video
...
Рейтинг: 0 / 0
18.12.2014, 14:10
    #38837028
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
DDiverесли у меня уже есть некая объектная модель, которую мне нужно редактировать и сохранять в БД, то мне нужно создать для каждого своего класса обёртку с пропертями для биндинга, и потом как-то эту химеру превращать в свой оригинальный класс?

Да. Это называется Model-View-ViewModel (MVVM). Model - ваша существующая модель. View - это JavaFX контролы. ViewModel это "обёртка" с биндингами. На простом проекте это, конечно, раздражает. Но на крупных проетах будет видна разница, так как ViewModel может быть и в структуре адаптирована для View, тем самым разрывая сильную связь между View и Model.

DDiverИли же в таком случае всё по старинке? навводили в форму данных, по кнопке сграбили из всех полей в соответствующие поля объекта и сохранили в БД? Тогда получаю проблему с отображением всяких ListView и TableView.

Не-не-не. Не вариант.

DDiverЧто-то вроде такого придётся пилить?
К сожалению, да. У меня получилось вот так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
public abstract class AbstractView<T> implements View<T>{
    T model;

    public AbstractView(T model) {
        this.model = model;
    }

    @Override
    public T getModel() {
        updateModelFromView();
        return this.model;
    }

    protected  <T, V extends View<T>> List<T> getModel(List<V> views) {
        ArrayList<T> result = new ArrayList<T>();
        for (V view : views) {
            result.add(view.getModel());
        }
        return result;
    }


    protected abstract void updateModelFromView();
}


public class FeatureView extends AbstractView<Feature>{
    SimpleBooleanProperty use;
    SimpleStringProperty name;
    SimpleStringProperty description;
    SimpleStringProperty vendor;

    public FeatureView(Feature model) {
        super(model);
        use = new SimpleBooleanProperty(model, "use", model.isUse());
        name = new SimpleStringProperty(model, "name", model.getName());
        description = new SimpleStringProperty(model, "description", model.getDescription());
        vendor = new SimpleStringProperty(model, "vendor", model.getVendor());
    }

    @Override
    protected void updateModelFromView() {
        //Здесь одновляются все mutable свойства.
        model.setUse(use.get());
    }

    public SimpleBooleanProperty useProperty() {
        return use;
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public SimpleStringProperty descriptionProperty() {
        return description;
    }

    public SimpleStringProperty vendorProperty() {
        return vendor;
    }

    public void setUse(Boolean use) {
        this.use.set(use);
    }
}
...
Рейтинг: 0 / 0
22.12.2014, 16:49
    #38839872
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
Blazkowicz,

может ещё чутка поможете? а то эти биндинги с пропетями уже повредили рассудок.
допустим есть класс
Код: java
1.
2.
3.
4.
class MyClassA {
  private String s;
  private List<MyClassB> list;
}


для переменной s всё понятно, используем в обёртке StringProperty.
а как поступить с листом?
Код: java
1.
2.
3.
class MyClassAWrapper {
ListProperty<MyClassB> list;
}


или
Код: java
1.
2.
3.
class MyClassAWrapper {
ListProperty<MyClassBWrapper> list;
}


элементы списка так же будут использоваться в GUI (изменяться, добавляться, удаляться)

1 - Если всё оборачивать, то для получения самого верхнего объекта(MyClassA), придется пробегать по всей коллекции и получать getModel() у каждого такого врапера(MyClassBWrapper) и засовывать полученные объекты в коллекцию оригинального класса.

2 - Если же хранить исходные объекты, то ,во-первых, получается каша из классов и ,во-вторых, нужно в самом контроллере будет создавать обёртки, перед передачей выбранного объекта на редактирование в другое окно.

Склоняюсь к первому варианту. Тогда View будет получать уже готовые обёртки от сервиса, как-то с ними работать, и возвращать обратно сервису, который уже развернет всё обратно. Только вот что-то лишней писанины ну просто до … получается.

Пока тока один геморрой, и никакого профита :(
...
Рейтинг: 0 / 0
23.12.2014, 17:01
    #38840890
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
чо-то какой-то пушной зверёк вырисовывается.
вот что приблизительно получается:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
class Element {
    public String name;
}
class ElementView {
    private Element e;
    public StringProperty name;

    ElementView(Element element) {
        this.e = element;
        this.name = new SimpleStringProperty(element, "name", element.name);
    }
    public void updateModelFromView() {
        e.name = name.get();
    }
    public Element getModel() {return e;}
}

class MyObject {
    public List<Element> list;
}
class MyObjectView {
    private MyObject obj;
    public ListProperty<ElementView> list;

    MyObjectView(MyObject myObject) {
        this.obj = myObject;
        createPropertyForList(myObject);
    }
    private void createPropertyForList(MyObject myObject) {
        ObservableList<ElementView> elementViews = wrapAndReturnListElements(myObject);
        elementViews.addListener((ListChangeListener<ElementView>) c -> {
            if(c.next()) {
                if(c.wasRemoved()) {
                    for (ElementView view : c.getRemoved()) {
                        obj.list.remove(view.getModel());
                    }
                } else if(c.wasAdded()) {
                    for (ElementView view : c.getAddedSubList()) {
                        obj.list.add(view.getModel());
                    }
                }
            }
        });
        this.list = new SimpleListProperty<>(myObject, "list", elementViews);
    }
    private ObservableList<ElementView> wrapAndReturnListElements(MyObject myObject) {
        return FXCollections.observableArrayList(convertToView(myObject));
    }
    private List<ElementView> convertToView(MyObject myObject) {
        return myObject.list.stream().map(ElementView::new).collect(Collectors.toList());
    }
    public void updateModelFromView() {/*more code if we have another class variables*/}
    public MyObject getModel() {return obj;}
}



Т.к. объекты подгружаются хибером, то просто очистить коллекцию и добавить всё из ObservableList'а не получиться. Единственный способ до которого я дошёл, синхронизировать состояние коллекции объекта(модели) с listProperty через листенер.

Простая пограмулька с простой логикой, превращается в какого-то Франкинштейна.

И что самое печальное, не понятно, в верном ли направление все эти бултыхания.

В интернетах все примеры, аля, ХеллоуВорлд.

ВИ простейший:
- Пользователь получает список объектов.
- Выбирает нужный и жмёт пимпу редактировать
- Открывается окно со списком свойств самого объекта и списком объектов в его коллекции.
- Пользователь может выбрать объект из этой коллекции и также открыть окно его редактирования.

Кто-то же наверняка уже делал подобного рода интерфейсы, как вы это реализовывали?
need HELP
...
Рейтинг: 0 / 0
23.12.2014, 17:10
    #38840912
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
DDiver,

может я что не понимаю, может можно было бы лист, который получаешь от хибера обернуть в ObservableListWrapper?
...
Рейтинг: 0 / 0
23.12.2014, 17:20
    #38840921
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
danatrielDDiver,

может я что не понимаю, может можно было бы лист, который получаешь от хибера обернуть в ObservableListWrapper?
видел этот класс, но почему-то подумал что это не то что мне нужно :(
спасибо, добрый человек.
одной головной болью меньше.
...
Рейтинг: 0 / 0
23.12.2014, 17:28
    #38840923
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
DDiver,

честно сказать, спасибо не мне, а человеку-базе знаний Blazkowicz, потому что я задавал аналогичные вопросы ему:)
...
Рейтинг: 0 / 0
23.12.2014, 20:14
    #38841075
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
Т.к. объекты подгружаются хибером, то просто очистить коллекцию и добавить всё из ObservableList'а не получиться. Единственный способ до которого я дошёл, синхронизировать состояние коллекции объекта(модели) с listProperty через листенер.

Простая пограмулька с простой логикой, превращается в какого-то Франкинштейна.

И что самое печальное, не понятно, в верном ли направление все эти бултыхания.

В интернетах все примеры, аля, ХеллоуВорлд.

ВИ простейший:
- Пользователь получает список объектов.
- Выбирает нужный и жмёт пимпу редактировать
- Открывается окно со списком свойств самого объекта и списком объектов в его коллекции.
- Пользователь может выбрать объект из этой коллекции и также открыть окно его редактирования.

Кто-то же наверняка уже делал подобного рода интерфейсы, как вы это реализовывали?
need HELP

не лучше пользователь выбирает с каким объектом работать нажимает редактировать и редактирует его.
если ему вложенные объекты надо редактировать так не проще ли сразу перейти к этим объектам.

в контексте webinterface то там проще каждый вложенный объект это сслылка на страницу редактирования свойст этого объекта.
сслыка генерируется динамически.

в контексте javafx то как вариант можно разбить на панели каждая из которых работает с определенным объектом.
тогда если вложенные объекты нужно искать в связке с родителем то просто нужно добавить фильтр по родителю
...
Рейтинг: 0 / 0
28.12.2014, 16:01
    #38844822
AlexJm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
[quot lleming

ВИ простейший:
- Пользователь получает список объектов.
- Выбирает нужный и жмёт пимпу редактировать
- Открывается окно со списком свойств самого объекта и списком объектов в его коллекции.
- Пользователь может выбрать объект из этой коллекции и также открыть окно его редактирования.

Кто-то же наверняка уже делал подобного рода интерфейсы, как вы это реализовывали?
need HELP[/quot]
И Вы это всё собираетесь делать на сыром и абсолютно недоделанном JavaFX? Где понятие DataBinding присутствует
только в головах создателей этого чуда? Не пробовали Delphi использовать? Или хотя бы DotNet?
...
Рейтинг: 0 / 0
28.12.2014, 16:09
    #38844829
AlexJm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
DDiverчо-то какой-то пушной зверёк вырисовывается.
...

Ага. особенно прикольно это наблюдать после того, как сбиндишь грид и TextField,
который так красиво меняет свое значение ровно до изменения циферки в TableView.
А потом - всё. Красивость, Observable, Bindings вообще перестают волновать. Потому
что рисовали ltutythfns.
...
Рейтинг: 0 / 0
18.08.2015, 16:59
    #39031800
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
BlazkowiczDDiverесли у меня уже есть некая объектная модель, которую мне нужно редактировать и сохранять в БД, то мне нужно создать для каждого своего класса обёртку с пропертями для биндинга, и потом как-то эту химеру превращать в свой оригинальный класс?

Да. Это называется Model-View-ViewModel (MVVM). Model - ваша существующая модель. View - это JavaFX контролы. ViewModel это "обёртка" с биндингами. На простом проекте это, конечно, раздражает. Но на крупных проетах будет видна разница, так как ViewModel может быть и в структуре адаптирована для View, тем самым разрывая сильную связь между View и Model.

DDiverИли же в таком случае всё по старинке? навводили в форму данных, по кнопке сграбили из всех полей в соответствующие поля объекта и сохранили в БД? Тогда получаю проблему с отображением всяких ListView и TableView.

Не-не-не. Не вариант.

DDiverЧто-то вроде такого придётся пилить?
К сожалению, да. У меня получилось вот так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
public abstract class AbstractView<T> implements View<T>{
    T model;

    public AbstractView(T model) {
        this.model = model;
    }

    @Override
    public T getModel() {
        updateModelFromView();
        return this.model;
    }

    protected  <T, V extends View<T>> List<T> getModel(List<V> views) {
        ArrayList<T> result = new ArrayList<T>();
        for (V view : views) {
            result.add(view.getModel());
        }
        return result;
    }


    protected abstract void updateModelFromView();
}


public class FeatureView extends AbstractView<Feature>{
    SimpleBooleanProperty use;
    SimpleStringProperty name;
    SimpleStringProperty description;
    SimpleStringProperty vendor;

    public FeatureView(Feature model) {
        super(model);
        use = new SimpleBooleanProperty(model, "use", model.isUse());
        name = new SimpleStringProperty(model, "name", model.getName());
        description = new SimpleStringProperty(model, "description", model.getDescription());
        vendor = new SimpleStringProperty(model, "vendor", model.getVendor());
    }

    @Override
    protected void updateModelFromView() {
        //Здесь одновляются все mutable свойства.
        model.setUse(use.get());
    }

    public SimpleBooleanProperty useProperty() {
        return use;
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public SimpleStringProperty descriptionProperty() {
        return description;
    }

    public SimpleStringProperty vendorProperty() {
        return vendor;
    }

    public void setUse(Boolean use) {
        this.use.set(use);
    }
}



Прошу прощения у автора топика (если он, конечно, видит), но у меня вопрос непосредственно к уважаемому Blazkowicz.
Интересен Ваш вариант построения решени. Так как только разбираюсь, хочу спросить - в Вашем коде Вы ушли от ViewModel?
Понимаю, что прошло определенное время, просто нужно разобраться с подходом) Спасибо заранее)
...
Рейтинг: 0 / 0
19.08.2015, 12:39
    #39032240
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
подскажите по javafx
NDAlekseyТак как только разбираюсь, хочу спросить - в Вашем коде Вы ушли от ViewModel?
Понимаю, что прошло определенное время, просто нужно разобраться с подходом) Спасибо заранее)
Нет, не ушел. Я привел пример из своего проекта. Да, код местами туповатый. Но на крупном ERP проекте выгода от MVVM будет более очевидна. А c дефолтными методами в Java 8, можно ещё больше логики шарить между клиентом и сервером.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / подскажите по javafx / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]