To apply custom CellFactories that format the displayed text inside a cell, its color, etc., the following example may be useful.
initial situation
Suppose you have a Bean / POJO Person:
public class Person {
private double levelOfGrowth = 0;
public Person() {};
public Person(double levelOfGrowth) {
this.levelOfGrowth = levelOfGrowth;
};
public double getLevelOfGrowth() {
return levelOfGrowth;
}
}
Where levelOfGrowthis the percentage of how complete a person’s growth is.
It can be set between 0.00 and 1.00.
, FXML, MainWindowController. levelOfGrowth id levelOfGrowthColumn
public class MainWindowController implements Initializable {
@FXML
public TableColumn levelOfGrowthColumn;
@Override
public void initialize(URL url, ResourceBundle rb) {
ObservableList<Person> persons = FXCollections.observableArrayList();
persons.add(new Person(0));
persons.add(new Person(0.5));
persons.add(new Person(1));
levelOfGrowthColumn.setCellValueFactory(new PropertyValueFactory<Person, Double>("levelOfGrowth"));
}
}
, , , 0,5 50%. , 100%, .
() , , / levelOfGrowthColumn.
"formatter" -
public class PercantageFormatCell extends TableCell<Object, Double> {
public PercantageFormatCell() {
}
@Override
protected void updateItem(Double item, boolean empty) {
super.updateItem(item, empty);
if (!empty && null == item) {
item = new Double(0.0d);
}
setText(item == null ? "" : NumberFormat.getPercentInstance().format(item));
if (item != null) {
double value = item.doubleValue();
if (isFocused() || isSelected() || isPressed()) {
setTextFill(Color.WHITE);
} else if (value < 1) {
setTextFill(Color.BLACK);
} else {
setTextFill(Color.GREEN);
}
}
}
}
public class MainWindowController implements Initializable {
@FXML
public TableColumn levelOfGrowthColumn;
@Override
public void initialize(URL url, ResourceBundle rb) {
ObservableList<Person> persons = FXCollections.observableArrayList();
persons.add(new Person(0));
persons.add(new Person(0.5));
persons.add(new Person(1));
Callback<TableColumn, TableCell> percantageCellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new PercantageFormatCell();
}
};
levelOfGrowthColumn.setCellFactory(percantageCellFactory);
levelOfGrowthColumn.setCellValueFactory(new PropertyValueFactory<Person, Double>("levelOfGrowth"));
}
}