2014-06-17 45 views
0

我在麻煩......我有一個JavaFX Tableview tha cointain,在一列中,有些結果。這些結果可以是「OK」,「N/A」和「KO」,如果我有一個「OK」,我用綠色畫它,如果我有一個「N/A」 KO「我把它塗成紅色(全部用方法setStyle())。問題是,當我垂直滑動表格時,文本的顏色隨機變化,我的紅色「OK」或綠色的「KO」...我想我應該使用類似repaint()但JavaFX沒有它,那我該怎麼辦?關於結果的代碼:JavaFX:如何「重繪」一個tableview

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

這是http://stackoverflow.com/questions/11065140/javafx-2-1-tableview-refresh-items的副本,但解決方案張貼在這個問題做了不適合我,所以我認爲這個問題應該更新或應該回答。 – Cobbles

+0

我已經四處尋找一些答案,但我無法在這裏找到解決方案,所以我決定發佈這個問題:)希望它可以幫助... – Peppalvino

+0

也許你的默認應該刪除所有樣式類而不是setStyle(「」 ) – brian

回答

0

在每種情況下,刪除所有樣式類,然後添加所需的樣式類。而且,正如@brian在評論中所說,在默認情況下,刪除所有樣式類。

原因是樣式類表示爲List<String>,所以它可以包含重複的值。 remove(...)方法僅刪除一個副本。在updateItem(...)方法中嘗試System.out.println(getStyleClass());,您可能會看到構建類的列表。

我會做:

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); 
         } 
        } 
+0

它的作品!非常感謝詹姆斯!我只有另一個小問題...我的列表是dinamically更新的...有時第一個元素必須從OK更改爲N/A,並且當此更新圖形的唯一方法是向下滾動然後再向上滾動,因爲只有當我隱藏元素的圖形變化...解決方案? – Peppalvino

+0

這是一個不同的問題,並可能已經在網站上的其他地方回答。 –