2017-07-17 19 views
0

我正在使用僞類來更改JavaFx TreeCell的格式化,具體取決於樹單元格中數據給出的條件。以下代碼有效:刪除用僞類添加的JavaFX TreeCell格式化

public class EmfTreeCellImpl extends TreeCell<EmfTreeNode> { 

    PseudoClass AMBIGUOUS_FEATURE = PseudoClass.getPseudoClass("ambiguous-feature"); 

    public EmfTreeCellImpl() { 
    } 

    @Override 
    protected void updateItem(EmfTreeNode item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty || item == null) { 
      setText(null); 
      setGraphic(null); 
      return; 
     } 
     setText(item.getLabel()); 
     setEditable(false); 
     if (item instanceof EmfTreeNode.SingleAttributeNode) { 
      EmfTreeNode.SingleAttributeNode san = (EmfTreeNode.SingleAttributeNode) item; 
      //pseudoClassStateChanged(AMBIGUOUS_FEATURE, san.isAmbiguous()); 
      pseudoClassStateChanged(AMBIGUOUS_FEATURE, san.isAmbiguous()); 
     } 
    } 
} 

單元格會正確突出顯示。問題在於突出顯示在GUI中的特定樹單元中是「持久」的。也就是說,如果我摺疊或展開其他樹枝,突出顯示將保持「就位」,突出顯示不符合條件的其他細胞。我認爲setGraphic(null)將刪除格式。

爲了解決這個我添加了一個額外的行到的updateItem清除格式:

if (empty || item == null) { 
    setText(null); 
    setGraphic(null); 
    pseudoClassStateChanged(AMBIGUOUS_FEATURE, false); 
    return; 
} 

但不知何故,感覺我應該只能爲去除已格式化或使用更多的那些格式「全球」明確。

+1

我不明白爲什麼你會發現自己的解決方案缺乏 - 如果你在設置一個僞類的'TreeCell'你要清楚它時,它不再有效。將圖形設置爲「null」不會改變「TreeCell」本身的樣式。我猜你可能會在用作圖形內容的節點上設置樣式,但在某些情況下可能無法實現,具體取決於您的實際樣式。據我所知,去除一個僞類是沒有問題的,如果它不是活動的 - 這就是使用僞類而不是樣式類的要點。 – Itai

+0

我想我只是期待更「優雅」的方式。我猜那裏的資源非常少,真正解釋了JavaFX在sceens背後的工作方式,因此很難理解某個解決方案是否與框架哲學保持一致。 – Arcanefoam

+0

我同意文檔有些不足,框架哲學有時可能看起來不一致。也許更優雅的是使用內建的'empty'或'filled'僞類,所以你的CSS規則可以是':filled:ambiguous-feature',這意味着它永遠不會適用於空單元格。查看[JavaFX CSS參考](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html#cell) – Itai

回答

1

正如評論指出,在回答自己提出的解決方案是完全有效的,但是處理可以利用更簡潔的方式內置filled僞類的Cell會自動被應用到任何非空單元格:

:filled:ambiguous-feature { 
    /* css-styling of non-empty ambiguous cells */ 
}