【问题标题】:JavaFX tableview colorsJavaFX 表格视图颜色
【发布时间】:2012-11-21 17:41:34
【问题描述】:

我需要创建具有多色行的 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;}

但我仍然需要突出显示选定的行。我该怎么做?

【问题讨论】:

    标签: java tableview javafx


    【解决方案1】:

    无需在 CSS 中为整个单元格设置背景颜色,只需设置 -fx-control-inner-background。然后,您将仍然可以使用默认的重音、悬停和聚焦环。当然,还要删除 setPriorityStyle 调用周围的 if 语句。

    如果您还想覆盖默认重音(选定)颜色或悬停颜色等内容,您也可以按照下面的 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 的详细样式信息可以在 JavaFX 2.2 的默认 caspian.css stylesheetJavaFX 2 CSS reference guide 中找到。要查找适用于您的 JavaFX 版本的 caspian.css,您可以解压缩 jfxrt.jar(有时在 jre/lib 目录中找到)。

    更新

    JavaFX 的默认样式表现在命名为 modena.css 而不是 caspian.css

    【讨论】:

    • 谢谢))你能回答吗,我在哪里可以找到这些 css 属性的列表(如 -fx-control-inner-background、-fx-accent)或一些示例?
    • 我还有一个问题:我可以同样突出显示一行中的单个单元格吗?
    • 是的,为包含单元格的列设置一个自定义cell factory,并在单元格工厂中提供可以根据需要操纵自己的样式的单元格。如果您需要更多详细信息,请发布一个新问题,我相信您会获得有关如何完成此操作的更多信息。
    • 是的 Aubin,看来该解决方案不再适用于 Java 8...真可惜。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2017-09-23
    • 2016-01-01
    • 2017-06-25
    • 2016-05-06
    • 2017-11-24
    • 2011-04-27
    相关资源
    最近更新 更多