2016-04-17 3 views
0

В моем приложении Java Desktop у меня есть TableView, в котором я хочу иметь столбец с звездами рейтинга из org.controlsfx.control.Rating.Как добавить рейтинг внутри TableView в JavaFX

@FXML 
private TableView<Disciplina> tableFilter; 
@FXML 
private TableColumn<Disciplina, Rating> ratingColumn; 
@FXML 
private ObservableList<Disciplina> masterData = FXCollections.observableArrayList(); 

я нашел что-то с .setCellValueFactory (новый CallBack()), но я не понял, как это работает. Итак, как я могу добавить эти звезды рейтинга в мой табличный вид?

+1

Попробуйте посмотреть на [этого урока] (http://java-buddy.blogspot.com/2013/03/javafx-embed-button-in-tableview.html). Они используют Button там, но это должно быть очень похоже. – Itai

+0

Этот вопрос слишком широк для этого форума: вам нужно попробовать что-то и задать конкретный вопрос, если вы не можете заставить его работать. Обратите внимание, что ваш тип столбца таблицы неверен (предполагается, что вы здесь ссылаетесь на элемент управления ControlsFX 'Рейтинг'):' Рейтинг' - это элемент управления; тип столбца должен быть типом отображаемых данных. «Рейтинг» отображает значение, хранящееся в 'DoubleProperty', поэтому вы должны иметь' private TableColumn ratingColumn' и использовать фабрику ячеек для отображения «Рейтинг». –

ответ

0

Не используйте 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; 
    } 

} 
Смежные вопросы