Подтвердить что ты не робот

Цвета таблиц 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;}

Но мне все еще нужно выделить выделенные строки. Как я могу это сделать?

4b9b3361

Ответ 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).