У меня есть Article класс с некоторыми Properties внутри.

public class Article {
    private IntegerProperty id;
    private StringProperty name;
    private StringProperty description;
    private FloatProperty price;

    public Article(int id, String name, String description, float price) {
        this.id = new SimpleIntegerProperty(id);
        this.name = new SimpleStringProperty(name);
        this.description = new SimpleStringProperty(description);
        this.price = new SimpleFloatProperty(price);
    }

    ...
}

И у меня есть класс Sale, который ссылается на одну статью.

public class Sale {
    private IntegerProperty id;
    private ObjectProperty<Article> article;
    private FloatProperty discount;
    private IntegerProperty quantity;
    private FloatProperty total;

    public Sale(int id, Article article, float discount, int quantity) {
        this.id = new SimpleIntegerProperty(id);
        this.article = new SimpleObjectProperty<>(article);
        this.discount = new SimpleFloatProperty(discount);
        this.quantity = new SimpleIntegerProperty(quantity);
        this.checked = new SimpleBooleanProperty(false);

        this.total = new SimpleFloatProperty();
        this.total.bind(Bindings.multiply(Bindings.subtract(this.article.get().priceProperty(), Bindings.multiply(this.article.get().priceProperty(), this.discount)), this.quantity));
    }

    public void setArticle(Article article) {
        this.article.set(article);
    }
    ...
}

Как правильно связать всю собственность? Теперь, если я сделаю что-то подобное, общее количество не будет динамически меняться в tableView.

Sale sale = new Sale(0, article1, 0.1f, 2);
sale.setArticle(article2); 

Я полагаю, что я должен сделать ссылку на articleProperty не значение, но я не знаю, как это сделать.

1
legomolina 28 Май 2017 в 18:07

2 ответа

Лучший ответ

Вы можете использовать Bindings.selectFloat:

this.total.bind(Bindings.multiply(Bindings.selectFloat(this.article, "price")
                                          .multiply(this.quantity),
                                  Bindings.subtract(1d, this.discount)));
2
fabian 28 Май 2017 в 15:26

Ты можешь сделать:

public Sale(int id, Article article, float discount, int quantity) {
    this.id = new SimpleIntegerProperty(id);
    this.article = new SimpleObjectProperty<>(article);
    this.discount = new SimpleFloatProperty(discount);
    this.quantity = new SimpleIntegerProperty(quantity);
    this.checked = new SimpleBooleanProperty(false);

    this.total = new SimpleFloatProperty();

    FloatProperty articlePriceProperty = new SimpleFloatProperty();
    if (this.article != null) {
        articlePriceProperty.bind(article.priceProperty());
    }
    this.article.addListener((obs, oldArticle, newArticle) -> {
        articlePriceProperty.unbind();
        if (newArticle == null) {
            articlePriceProperty.set(0);
        } else {
            articlePriceProperty.bind(newArticle.priceProperty());
        }
    });
    this.total.bind(Bindings.multiply(Bindings.subtract(articlePriceProperty, Bindings.multiply(articlePriceProperty(), this.discount)), this.quantity));
}
1
James_D 28 Май 2017 в 15:21