JavaFX таблицы цветов
Мне нужно создать JavaFx TableView с многоцветными строками (color1 для низкого приоритета, color2 для среднего приоритета и т. д.). Я создал CellFactory
public class TaskCellFactory implements Callback<TableColumn, TableCell> {
@Override
public TableCell call(TableColumn p) {
TableCell cell = new TableCell<Task, Object>() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : getString());
setGraphic(null);
TableRow currentRow = getTableRow();
Task currentTask = currentRow == null ? null : (Task)currentRow.getItem();
if(currentTask != null){
Priority priority = currentTask.getPriority();
clearPriorityStyle();
if(!isHover() && !isSelected() && !isFocused()){
setPriorityStyle(priority);
}
}
}
@Override
public void updateSelected(boolean upd){
super.updateSelected(upd);
System.out.println("is update");
}
private void clearPriorityStyle(){
ObservableList<String> styleClasses = getStyleClass();
styleClasses.remove("priorityLow");
styleClasses.remove("priorityMedium");
styleClasses.remove("priorityHigh");
}
private void setPriorityStyle(Priority priority){
switch(priority){
case LOW:
getStyleClass().add("priorityLow");
break;
case MEDIUM:
getStyleClass().add("priorityMedium");
break;
case HIGH:
getStyleClass().add("priorityHigh");
break;
}
System.out.println(getStyleClass());
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
};
return cell;
} }
и CSS
.priorityLow{ -fx-background-color: palegreen; }
.priorityMedium{ -fx-background-color: skyblue;}
.priorityHigh{ -fx-background-color: palevioletred;}
Но мне все еще нужно выделить выделенные строки. Как я могу это сделать?
1 ответ
Вместо того, чтобы устанавливать цвет фона для всей ячейки в вашем CSS, просто установите -fx-control-inner-background. Тогда у вас будут по умолчанию кольца акцента, наведения и фокусировки. Также удалите оператор if вокруг вашего setPriorityStyle
позвони конечно.
Если вы также хотите переопределить такие вещи, как цвет акцента (выбранный) по умолчанию или цвет при наведении, вы также можете сделать это, как в приведенном ниже CSS-коде - не уверен, что переопределения подсветки действительно рекомендуются, хотя, думаю, это будет зависеть от вашего приложения и желаемый пользовательский опыт.
.priorityLow {
-fx-control-inner-background: palegreen;
-fx-accent: derive(-fx-control-inner-background, -40%);
-fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
.priorityMedium {
-fx-control-inner-background: skyblue;
-fx-accent: derive(-fx-control-inner-background, -40%);
-fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
.priorityHigh {
-fx-control-inner-background: palevioletred;
-fx-accent: derive(-fx-control-inner-background, -40%);
-fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
Подробную информацию о стилях для JavaFX можно найти в таблице стилей по умолчанию caspian.css для JavaFX 2.2 и справочном руководстве CSS для JavaFX 2. Чтобы найти caspian.css для вашей версии JavaFX, вы можете разархивировать jfxrt.jar
(иногда находится в каталоге jre/lib).