Не используйте cellValueFactory
, используйте cellFactory
для создания визуального представления содержимого в столбце.
TableView<RatingItem> tableView = new TableView<>(FXCollections.observableArrayList(
new RatingItem(0),
new RatingItem(2),
new RatingItem(1),
new RatingItem(4),
new RatingItem(5)
));
tableView.setEditable(true);
TableColumn<RatingItem, Number> ratingColumn = new TableColumn<>("rating");
tableView.getColumns().add(ratingColumn);
// cellValueFactory gets value from item
ratingColumn.setCellValueFactory(cd -> cd.getValue().ratingProperty());
// cellFactory creates UI representation
ratingColumn.setCellFactory(table -> new TableCell<RatingItem, Number>() {
private final Rating rating;
private final ChangeListener<Number> ratingChangeListener;
{
rating = new Rating(5);
// listener for changes in rating
ratingChangeListener = (observable, oldValue, newValue) -> {
TableColumn<?, Number> column = getTableColumn();
// get the property used for this column (has to be WritableDoubleProperty)
WritableDoubleValue value = (WritableDoubleValue) column.getCellValueFactory().call(new TableColumn.CellDataFeatures(getTableView(), column, getTableRow().getItem()));
value.set(newValue.doubleValue());
};
}
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
rating.ratingProperty().removeListener(ratingChangeListener);
if (empty) {
setGraphic(null);
} else {
rating.setRating(item.doubleValue());
// only listen to changes done later through user interaction
rating.ratingProperty().addListener(ratingChangeListener);
setGraphic(rating);
}
}
});
public class RatingItem {
private final DoubleProperty rating;
public RatingItem(int rating) {
this.rating = new SimpleDoubleProperty(rating);
}
public final double getRating() {
return this.rating.get();
}
public final void setRating(double value) {
this.rating.set(value);
}
public final DoubleProperty ratingProperty() {
return this.rating;
}
}
Попробуйте посмотреть на [этого урока] (http://java-buddy.blogspot.com/2013/03/javafx-embed-button-in-tableview.html). Они используют Button там, но это должно быть очень похоже. – Itai
Этот вопрос слишком широк для этого форума: вам нужно попробовать что-то и задать конкретный вопрос, если вы не можете заставить его работать. Обратите внимание, что ваш тип столбца таблицы неверен (предполагается, что вы здесь ссылаетесь на элемент управления ControlsFX 'Рейтинг'):' Рейтинг' - это элемент управления; тип столбца должен быть типом отображаемых данных. «Рейтинг» отображает значение, хранящееся в 'DoubleProperty', поэтому вы должны иметь' private TableColumn ratingColumn' и использовать фабрику ячеек для отображения «Рейтинг». –