如何根据tableview中可以更改的数据更改行颜色?

时间:2013-06-23 20:19:39

标签: css javafx-2 tableview background-color

我正在编写播客播放器,并显示我显示的文件列表。

用户可以双击某个条目并播放该文件。如果他们选择另一个。我不知道列表中选择了什么。我们的想法是突出显示以不同颜色播放的文件。仍然保持选择另一个文件的能力(不想失去该功能)。大多数音频播放器都遵循相同的原则。

我查看了这个JavaFX tableview colors,这会根据数据更改行的颜色。但是,如果数据发生变化,则在数据更改时不会刷新行颜色。

我有一个带有单元工厂的表,基于变量“isSelectedFile”我设置了单元格样式。

如果在加载时isSelectedFile = True,一切正常,但是一旦我将数据加载到tableview中而更改了数据,它就不会刷新。

我的细胞工厂如下:

entryDisplayNameColumn.setCellFactory(new Callback<TableColumn<PlaylistEntry, String>, TableCell<PlaylistEntry, String>>() {
            @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();
                        PlaylistEntry ple = currentRow == null ? null : (PlaylistEntry) currentRow.getItem();

                        if (ple != null) {
                            clearPriorityStyle();
                            setPriorityStyle(ple.isSelectedFile());
                        }
                    }

                    @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(boolean activeValue) {
                        if (activeValue) {
                            getStyleClass().add("priorityLow");
                        } else {
                            getStyleClass().add("priorityMedium");
                        }
                    }

                    private String getString() {
                        return getItem() == null ? "" : getItem().toString();
                    }
                };
                return cell;
            }
        });

我的CSS:

.priorityLow { 
-fx-control-inner-background: snow;
-fx-accent: derive(-fx-control-inner-background, -40%);
-fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}

.priorityMedium { 
-fx-control-inner-background: #1d1d1d;
-fx-accent: derive(-fx-control-inner-background, -40%);
-fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
 }

1 个答案:

答案 0 :(得分:2)

试试这个完美的工作......

tablecol.setCellFactory(new Callback<TableColumn<CheckDo, String>, TableCell<CheckDo, String>>() {

        @Override
        public TableCell<CheckDo, String> call(TableColumn<CheckDo, String> p) {


             return new TableCell<CheckDo, String>() {

            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (!isEmpty())
                    this.setStyle("-fx-background-color:red");
                    this.getTableRow().setStyle("-fx-background-color:red");
                        setText(item);
                }
            }
        };