JavaFX:如何;“重新油漆”;桌面视图
我有麻烦了。。。我有一个JavaFX表格视图,在一列中包含了一些结果。这些结果可以是“OK”、“N/A”和“KO”,如果我有一个“OK”,我就把它画成绿色,如果我有一个“N/A”,我就把它画成黑色,如果我有一个“KO”,我就把它画成红色(全部通过方法setStyle()。问题是,当我垂直滑动表格时,文本的颜色会随机变化,红色的“OK”或绿色的“KO”。。。我想我应该使用repaint()之类的东西,但是JavaFX没有,所以我该怎么做呢?有关结果的代码:JavaFX:如何;“重新油漆”;桌面视图,java,css,colors,javafx,tableview,Java,Css,Colors,Javafx,Tableview,我有麻烦了。。。我有一个JavaFX表格视图,在一列中包含了一些结果。这些结果可以是“OK”、“N/A”和“KO”,如果我有一个“OK”,我就把它画成绿色,如果我有一个“N/A”,我就把它画成黑色,如果我有一个“KO”,我就把它画成红色(全部通过方法setStyle()。问题是,当我垂直滑动表格时,文本的颜色会随机变化,红色的“OK”或绿色的“KO”。。。我想我应该使用repaint()之类的东西,但是JavaFX没有,所以我该怎么做呢?有关结果的代码: for (ResultMatch res
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);
}
for(结果匹配结果:事件){
isMatch=(result.match().equals(“OK”)| | result.match().equals(“N/A”);
//设置样式
reader.getSampleController().xmlMatch.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableP列){
返回新的TableCell(){
@凌驾
public void updateItem(最终字符串项,最终布尔值为空){
super.updateItem(项,空);
如果(项!=null){
setText(项目);
设置对齐(位置中心);
开关(项目){
案例“OK”:
getStyleClass().remove(“koItem”);
getStyleClass().remove(“naItem”);
getStyleClass().add(“okItem”);
打破
案例“不适用”:
getStyleClass().remove(“okItem”);
getStyleClass().remove(“koItem”);
getStyleClass().add(“naItem”);
打破
“KO”案:
getStyleClass().remove(“okItem”);
getStyleClass().remove(“naItem”);
getStyleClass().add(“koItem”);
打破
违约:
设置样式(“”);
打破
}
}否则{
setText(空);
}
}
};
}
});
isPass=isPass&&isMatch;
reader.getSampleController().getViewXML().getItems().add(结果);
}
在每种情况下,在添加所需的样式类之前,请删除所有样式类。并且,正如@brian在注释中所说,在默认情况下,删除所有样式类
原因是样式类被表示为列表
,因此它可以包含重复的值。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);
}
}
final List allStyleClasses=Arrays.asList(“koItem”、“naItem”、“okItem”);
// ...
@凌驾
public void updateItem(最终字符串项,最终布尔值为空){
super.updateItem(项,空);
如果(项!=null){
setText(项目);
设置对齐(位置中心);
getStyleClass().removeAll(所有样式类);
开关(项目){
案例“OK”:
getStyleClass().add(“okItem”);
打破
案例“不适用”:
getStyleClass().add(“naItem”);
打破
“KO”案:
getStyleClass().add(“koItem”);
打破
违约:
打破
}
}否则{
setText(空);
}
}
这是的副本,但发布在该问题上的解决方案对我不起作用,因此我认为应该更新该问题或回答该问题。我四处寻找了一些答案,但在这里找不到解决方案,因此我决定发布此问题:)希望能有所帮助……也许您的默认设置应该删除所有问题样式类而不是setStyle(“”),它可以工作!!!非常感谢你,詹姆斯!!!我还有一个小问题。。。我的名单每天更新。。。有时,第一个元素必须从“OK”更改为“N/A”,出现这种情况时,更新图形的唯一方法是向下滚动,然后再次向上滚动,因为只有当我隐藏元素时,图形才会更改。。。解决方案?这是一个不同的问题,可能已经在网站的其他地方得到了回答。