Вы можете реализовать простое решение, основанное на значениях rgb этих цветов:
green in rgb is (0, 255, 0)<br/>
yellow in rgb is (255,255, 0)<br/>
red in rgb is (255, 0 , 0)<br/>
Итак, вы начинаете с зеленого, увеличиваете красный до желтого, а затем уменьшаете зеленый до красного:
public class Controller implements Initializable {
//defines the incremental change in color
private static final int COLOR_INCREMENT = 30;
//initial rgb values (green)
private int red = 0, green = 255, blue = 0;
@FXML
private Button button2;
@FXML
private DatePicker datePicker;
@FXML
private Label lbColor;
@Override
public void initialize(URL location, ResourceBundle resources) {
button2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
lbColor.setStyle("-fx-background-color:"+ getColorString()+";");
}
});
//Cell factory omitted. Not needed to demonstrate the question nor the answer
}
//increment color by COLOR_INCREMENT to step from green to yellow to red
//and return string representation of it
//green is rgb is (0, 255, 0)
//yellow rgb is (255, 255, 0)
//red in rgb is (255, 0, 0)
private String getColorString() {
if((green == 255) && (red < 255)) {
red = (red + COLOR_INCREMENT) > 255 ? 255 : (red + COLOR_INCREMENT) ;
}else if( (red == 255) && (green > 0)){
green = (green - COLOR_INCREMENT) < 0 ? 0 : (green - COLOR_INCREMENT) ;
}
StringBuilder sb = new StringBuilder("rgb(");
sb.append(red).append(",")
.append(green).append(",")
.append(blue).append(")");
return sb.toString();
}
}
Обратите внимание, что количество изменений ограничено и определяется размером COLOR_INCREMENT.Через 2 раза (255 / COLOR_INCREMENT) цвет остается красным.Это может быть дополнительно улучшено, преодолев этот предел.Также может быть полезно динамическое изменение (COLOR_INCREMENT)
Редактировать Вы, конечно, можете использовать тот же метод для изменения цвета DateCell
:
@Override
public void initialize(URL location, ResourceBundle resources) {
button2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
lbColor.setStyle("-fx-background-color:"+ getColorString()+";");
}
});
javafx.util.Callback<DatePicker, DateCell> set = new javafx.util.Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
//if today, change text and style
if (item.equals(LocalDate.now())) {
setText(date +"/" + clicksCounter);
setStyle("-fx-background-color: "+ getColorString () +"; ");
}
}
};
}
};
datePicker.setDayCellFactory(set);
}
Обратите внимание, что вызов getColorString ()
дважды (один раз кнопкойобработчик и один раз по фабрике ячеек) вызывает изменение цвета дваждыЧтобы предотвратить это, вы можете установить цветное поле.Поле обновляется обработчиком кнопки и используется Label
, а также фабрикой ячеек:
public class Controller implements Initializable {
protected static final int COLOR_INCREMENT = 30;
@FXML
private Button button2;
@FXML
private DatePicker datePicker;
@FXML
private Label lbColor;
private int red = 0, green = 255, blue = 0;
private String colorAsString; //string representation of rgb color
private int clicksCounter = 0;
private String date = String.valueOf(LocalDate.now().getDayOfMonth());
@Override
public void initialize(URL location, ResourceBundle resources) {
button2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
colorAsString = getColorString();
lbColor.setStyle("-fx-background-color:"+ colorAsString +";");
}
});
javafx.util.Callback<DatePicker, DateCell> set = new javafx.util.Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
//if today, change text and style
if (item.equals(LocalDate.now())) {
setText(date +"/" + clicksCounter);
setStyle("-fx-background-color: "+ colorAsString +"; ");
}
}
};
}
};
datePicker.setDayCellFactory(set);
}
//increment color by COLOR_INCREMENT to step from green to yellow to red
//and return string representation of it
//green is rgb is (0, 255, 0)
//yellow rgb is (255, 255, 0)
//red in rgb is (255, 0, 0)
private String getColorString() {
if((green == 255) && (red < 255)) {
red = (red + COLOR_INCREMENT) > 255 ? 255 : (red + COLOR_INCREMENT) ;
}else if( (red == 255) && (green > 0)){
green = (green - COLOR_INCREMENT) < 0 ? 0 : (green - COLOR_INCREMENT) ;
}
StringBuilder sb = new StringBuilder("rgb(");
sb.append(red).append(",")
.append(green).append(",")
.append(blue).append(")");
return sb.toString();
}
}