JavaFX:如何"重绘"一个tableview

时间:2014-06-17 08:36:27

标签: java css colors javafx tableview

我遇到了麻烦......我有一个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);
    }

1 个答案:

答案 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);
                        }
                    }