Во-первых, ваш Product
класс не обычный. Обычно имя поля соответствует имени свойства (например, name
, а не nameProperty
). Затем вы называете свой метод get, setter и property в качестве имени свойства. Например:
import javafx.beans.property.StringProperty;
import javafx.beans.property.SimpleStringProperty;
public class Product {
private final StringProperty name = new SimpleStringProperty(this, "name");
public final void setName(String name) { this.name.set(name); }
public final String getName() { return name.get(); }
public final StringProperty nameProperty() { return name; }
private final StringProperty quantity = new SimpleStringProperty(this, "quantity");
public final void setQuantity(String quantity) { this.quantity.set(quantity); }
public final String getQuantity() { return quantity.get(); }
public final StringProperty quantityProperty() { return quantity; }
public Product() {} // typically Java(FX)Beans provide no-arg constructors as well
public Product(String name, String quantity) {
setName(name);
setQuantity(quantity);
}
}
Примечание: Ваш класс не вложенный c вложенный (т. Е. Внутренний) класс. Это означает, что каждому экземпляру Product
требуется экземпляр включающего класса. Если вы хотите оставить Product
вложенным классом, рассмотрите возможность сделать его классом c. В моем примере выше предполагается, что Product
находится в его собственном исходном файле.
С помощью этого класса вы можете определить фабрики значений ячеек следующим образом:
TreeTableColumn<Product, String> nameCol = ...;
nameCol.setCellValueFactory(data -> data.getValue().getValue().nameProperty());
TreeTableColumn<Product, String> quantityCol = ...;
quantityCol.setCellValueFactory(data -> data.getValue().getValue().quantityProperty());
Примечание фабрики возвращают соответствующее свойство экземпляра Product
. Это решает вашу ошибку компиляции, поскольку StringProperty
является экземпляром ObservableValue<String>
. Это также означает, что ваша таблица имеет прямой доступ к свойству вспомогательной модели, что помогает поддерживать актуальность таблицы, а также реализовывать встроенное редактирование. фабрика значений nameCol
с использованием анонимного класса, который явно показывает все используемые типы:
nameCol.setCellValueFactory(new Callback<>() { // may have to explicitly define type arguments, depending on version of Java
@Override
public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Product, String> data) {
TreeItem<Product> treeItem = data.getValue();
Product product = treeItem.getValue();
return product.nameProperty();
}
});