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

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

Хочется сделать всё по уму [spoiler] youtube
YouTube Video
...
Рейтинг: 0 / 0
подскажите по javafx
    #38837028
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
подскажите по javafx
    #38839872
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
подскажите по javafx
    #38840890
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.
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
подскажите по javafx
    #38840912
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,

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

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

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

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

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

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

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

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

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

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

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

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

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

Ага. особенно прикольно это наблюдать после того, как сбиндишь грид и TextField,
который так красиво меняет свое значение ровно до изменения циферки в TableView.
А потом - всё. Красивость, Observable, Bindings вообще перестают волновать. Потому
что рисовали ltutythfns.
...
Рейтинг: 0 / 0
подскажите по javafx
    #39031800
NDAleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
подскажите по javafx
    #39032240
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NDAlekseyТак как только разбираюсь, хочу спросить - в Вашем коде Вы ушли от ViewModel?
Понимаю, что прошло определенное время, просто нужно разобраться с подходом) Спасибо заранее)
Нет, не ушел. Я привел пример из своего проекта. Да, код местами туповатый. Но на крупном ERP проекте выгода от MVVM будет более очевидна. А c дефолтными методами в Java 8, можно ещё больше логики шарить между клиентом и сервером.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / подскажите по javafx
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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