Цвета таблиц 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-internal-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%);
}
![rowhighlight]()
Подробную информацию о стиле для JavaFX можно найти по умолчанию caspian.css stylesheet для JavaFX 2.2 и Справочное руководство по JavaFX 2 CSS. Чтобы найти caspian.css для вашей версии JavaFX, вы можете unjar jfxrt.jar
(иногда найти в каталоге jre/lib).