【发布时间】:2017-07-17 08:28:22
【问题描述】:
我正在使用 PseudoClass 来更改 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本身的样式。我猜您可能会在用作图形内容的节点上设置样式,但在某些情况下这可能是不可能的,具体取决于您的实际样式。据我所知,如果伪类不处于活动状态,则删除它并没有什么问题——这就是使用伪类而不是样式类的意义所在。 -
我想我只是期待一种更“优雅”的方式。我想很少有资源可以真正解释 JavaFX 在幕后工作的方式,因此很难理解一个人的解决方案是否符合框架理念。
-
我同意文档有些缺乏,而且框架理念有时似乎不一致。也许更优雅的方法是使用内置的
empty或filled伪类,因此您的CSS 规则可以是:filled:ambiguous-feature,这意味着它永远不会应用于空单元格。见JavaFX CSS Reference -
太棒了!如果您将此作为答案发布,我将很乐意接受它作为答案。
标签: css treeview javafx-8 pseudo-class