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%);
}

rowhighlight


Подробную информацию о стилях для JavaFX можно найти в таблице стилей по умолчанию caspian.css для JavaFX 2.2 и справочном руководстве CSS для JavaFX 2. Чтобы найти caspian.css для вашей версии JavaFX, вы можете разархивировать jfxrt.jar (иногда находится в каталоге jre/lib).

Другие вопросы по тегам