我正在编写播客播放器,并显示我显示的文件列表。
用户可以双击某个条目并播放该文件。如果他们选择另一个。我不知道列表中选择了什么。我们的想法是突出显示以不同颜色播放的文件。仍然保持选择另一个文件的能力(不想失去该功能)。大多数音频播放器都遵循相同的原则。
我查看了这个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%);
}
答案 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);
}
}
};