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

我有麻烦了。。。我有一个JavaFX表格视图,在一列中包含了一些结果。这些结果可以是“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);
    }
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”,出现这种情况时,更新图形的唯一方法是向下滚动,然后再次向上滚动,因为只有当我隐藏元素时,图形才会更改。。。解决方案?这是一个不同的问题,可能已经在网站的其他地方得到了回答。