簡體   English   中英

JavaFX:如何“重繪”表視圖

[英]JavaFX: how to “repaint” a tableview

我很麻煩...我在列中有一個JavaFX Tableview,有些結果。 這些結果可以是“ OK”,“ N / A”和“ KO”,如果我有“ OK”,則將其塗成綠色,如果我有“ N / A”,則塗成黑色,如果我具有“ “我”將其塗成紅色(全部通過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);
    }

在每種情況下,請先刪除所有樣式類,然后再添加所需的樣式類。 並且,如@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);
                        }
                    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM