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;
}
但不知何故,感覺我應該只能爲去除已格式化或使用更多的那些格式「全球」明確。
我不明白爲什麼你會發現自己的解決方案缺乏 - 如果你在設置一個僞類的'TreeCell'你要清楚它時,它不再有效。將圖形設置爲「null」不會改變「TreeCell」本身的樣式。我猜你可能會在用作圖形內容的節點上設置樣式,但在某些情況下可能無法實現,具體取決於您的實際樣式。據我所知,去除一個僞類是沒有問題的,如果它不是活動的 - 這就是使用僞類而不是樣式類的要點。 – Itai
我想我只是期待更「優雅」的方式。我猜那裏的資源非常少,真正解釋了JavaFX在sceens背後的工作方式,因此很難理解某個解決方案是否與框架哲學保持一致。 – Arcanefoam
我同意文檔有些不足,框架哲學有時可能看起來不一致。也許更優雅的是使用內建的'empty'或'filled'僞類,所以你的CSS規則可以是':filled:ambiguous-feature',這意味着它永遠不會適用於空單元格。查看[JavaFX CSS參考](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html#cell) – Itai