我遇到了麻烦......我有一个JavaFX Tableview tha cointain,在一个专栏中,有一些结果。这些结果可以是“OK”,“N / A”和“KO”,如果我有一个“OK”我将它画成绿色,如果我有一个“N / A”我画的是黑色,如果我有一个“ KO“我用红色绘制它(全部通过方法setStyle())。问题是,当我垂直滑动表格时,文本的颜色随机变化,我的红色为“OK”或绿色为“KO”......我想我应该使用像repaint()这样的东西,但是JavaFX没有它那我该怎么办?关于结果的代码:
for (ResultMatch result : events) {
isMatch = (result.match().equals("OK") || result.match().equals("N/A"));
//Set the style
reader.getSampleController().xmlMatch.setCellFactory(new Callback<TableColumn<String, String>, TableCell<String, String>>() {
@Override
public TableCell call(TableColumn p) {
return new TableCell<String, String>() {
@Override
public void updateItem(final String item, final boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
setAlignment(Pos.CENTER);
switch (item) {
case "OK":
getStyleClass().remove("koItem");
getStyleClass().remove("naItem");
getStyleClass().add("okItem");
break;
case "N/A":
getStyleClass().remove("okItem");
getStyleClass().remove("koItem");
getStyleClass().add("naItem");
break;
case "KO":
getStyleClass().remove("okItem");
getStyleClass().remove("naItem");
getStyleClass().add("koItem");
break;
default:
setStyle("");
break;
}
} else {
setText(null);
}
}
};
}
});
isPass = isPass && isMatch;
reader.getSampleController().getViewXML().getItems().add(result);
}
答案 0 :(得分:0)
在每种情况下,删除所有样式类,然后添加所需的样式类。并且,正如@brian在评论中所说,在默认情况下,删除所有样式类。
原因是样式类表示为List<String>
,因此它可以包含重复值。 remove(...)
方法仅删除一个副本。在System.out.println(getStyleClass());
方法中尝试使用updateItem(...)
,您可能会看到正在构建的类列表。
我愿意:
final List<String> allStyleClasses = Arrays.asList("koItem", "naItem", "okItem");
// ...
@Override
public void updateItem(final String item, final boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
setAlignment(Pos.CENTER);
getStyleClass().removeAll(allStyleClasses);
switch (item) {
case "OK":
getStyleClass().add("okItem");
break;
case "N/A":
getStyleClass().add("naItem");
break;
case "KO":
getStyleClass().add("koItem");
break;
default:
break;
}
} else {
setText(null);
}
}