您可以基于这些颜色的RGB值实现一个简单的解决方案:
green in rgb is (0, 255, 0)
yellow in rgb is (255,255, 0)
red in rgb is (255, 0 , 0)
所以你从绿色开始,增加红色直到你变黄,然后减少绿色直到你变红:
public class Controller implements Initializable {
private static final int COLOR_INCREMENT = 30;
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()+";");
}
});
}
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();
}
}
请注意,更改的次数是有限的,并由颜色增量的大小定义。2次(255/颜色增量)后,颜色保持红色。
它可以进一步改进,克服这一限制。它还可以从动态(变化)颜色增量中受益。
编辑
你当然可以用同样的方法来改变
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 (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;
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 (item.equals(LocalDate.now())) {
setText(date +"/" + clicksCounter);
setStyle("-fx-background-color: "+ colorAsString +"; ");
}
}
};
}
};
datePicker.setDayCellFactory(set);
}
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();
}
}