Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同类字段的JavaFXTreeItem css样式_Java_Css_Javafx_Javafx 8 - Fatal编程技术网

不同类字段的JavaFXTreeItem css样式

不同类字段的JavaFXTreeItem css样式,java,css,javafx,javafx-8,Java,Css,Javafx,Javafx 8,我用自己的树填满了树景。在类Node中,我有一个字段类型,它是NodeType中的一个。问题是,我想为每种类型的节点类型设置样式,例如,type1文本颜色应为绿色,type2文本颜色应为红色。我是javaFX新手。我找到了james-d的解决方案,但在这个示例中,css样式取决于类名,如何为类字段设置它 我的理解是,您需要一个TreeCell,它的样式取决于所述TreeCell的TreeItem中包含的节点的NodeType。全部通过CSS。我说得对吗 假设我是正确的,我可以想出两种方法来实现这

我用自己的树填满了树景。在类Node中,我有一个字段类型,它是NodeType中的一个。问题是,我想为每种类型的节点类型设置样式,例如,type1文本颜色应为绿色,type2文本颜色应为红色。我是javaFX新手。我找到了james-d的解决方案,但在这个示例中,css样式取决于类名,如何为类字段设置它


我的理解是,您需要一个TreeCell,它的样式取决于所述TreeCell的TreeItem中包含的节点的NodeType。全部通过CSS。我说得对吗

假设我是正确的,我可以想出两种方法来实现这一点;如果存在少量已知节点类型,这两种方法都能发挥最佳效果。第一个涉及使用,第二个使用与JavaFX图表API相同的策略

第一选择 创建定制的TreeCell以使用您的节点类型,即适当指定通用签名。在这个定制TreeCell中,您可以根据需要声明尽可能多的伪类静态final字段;每个节点类型一个。然后观察TreeCell中当前显示的任何节点的节点类型,并相应地更新伪类状态

下面是一个示例,假设NodeType是一个枚举,它有两个常量:HAPPY和SAD

第二种选择
在处理多系列数据时,执行JavaFX图表API所做的操作。它所做的是根据列表中的系列索引动态更新节点的样式类,例如折线图系列数据-非常感谢您的回答;这对我很有帮助。我没有选中第一个和第二个选项,但在我的示例中,第三个选项对我来说是静态的NodeType。这是我的工作方法:我有个问题要问你们。在我的方法中有大约8个对pseudoClassStateChanged的调用,这是一个好的解决方案吗?我还想问为什么我在TreeView dissapear中使用伪类箭头。再一次谢谢你的帮助@Slaw@materaldo有8个对pseudoClassStateChanged的调用。。。应该没问题。在内部,它尝试将伪类添加到集合中或从集合中删除伪类,并且只有在成功的情况下(意味着有实际的更新),它才会继续重新应用CSS。换句话说,实现是非常懒惰/保守的,即使有很多调用,也应该可以。@materaldo关于丢失的箭头,我不知道为什么会发生这种情况。我只是很快地模仿了一些东西,箭就为我留下了。问题可能是你的CSS规则没有提供显示样式表的链接。我的CSS规则很简单。树形单元格:type1{-fx background:color;},给你,我正在进行一些代码重构,我检查了setDisclosureNodenull;方法这就是我的箭消失的原因:
public class CustomTreeCell<T extends Node> extends TreeCell<T> {

    private static final PseudoClass HAPPY = PseudoClass.getPseudoClass("happy");
    private static final PseudoClass SAD = PseudoClass.getPseudoClass("sad");

    // this listener will activate/deactivate the appropriate PseudoClass states
    private final ChangeListener<NodeType> listener = (obs, oldVal, newVal) -> {
        pseudoClassStateChanged(HAPPY, newVal == NodeType.HAPPY);
        pseudoClassStateChanged(SAD, newVal == NodeType.SAD);
    };

    // use a weak listener to avoid a memory leak
    private final WeakChangeListener<NodeType> weakListener = /* wrap listener */;

    public CustomTreeCell() {
        getStyleClass().add("custom-tree-cell");
        itemProperty().addListener((obs, oldVal, newVal) -> {
            if (oldVal != null) {
                oldVal.nodeTypeProperty().removeListener(weakListener);
            }
            if (newVal != null) {
                newVal.nodeTypeProperty().addListener(weakListener);
                // need to "observe" the initial NodeType of the new Node item.
                // You could call the listener manually to avoid code duplication
                pseudoClassStateChanged(HAPPY, newVal.getNodeType() == NodeType.HAPPY);
                pseudoClassStateChanged(SAD, newVal.getNodeType() == NodeType.SAD);
            } else {
                // no item in this cell so deactivate all PseudoClass's
                pseudoClassStateChanged(HAPPY, false);
                pseudoClassStateChanged(SAD, false);
            }
        });
    }
}
.custom-tree-cell:happy {
    /* style when happy */
}

.custom-tree-cell:sad {
    /* style when sad */
}
/*
 * Create a custom TreeCell like in the first option but
 * without any of the PseudoClass code. This listener should
 * be added/removed from the Node item just like weakListener
 * is above.
 */
ChangeListener<NodeType> listener = (obs, oldVal, newVal) -> {
    // You have to make sure you keep "cell", "indexed-cell", and "tree-cell"
    // in order to keep the basic modena styling.
    if (newVal == NodeType.HAPPY) {
        getStyleClass().setAll("cell", "indexed-cell", "tree-cell", "custom-tree-cell-happy");
    } else if (newVal == NodeType.HAPPY) {
        getStyleClass().setAll("cell", "indexed-cell", "tree-cell", "custom-tree-cell-sad");
    } else {
        getStyleClass().setAll("cell", "indexed-cell", "tree-cell"); // revert to regular TreeCell style
    }
};
.custom-tree-cell-happy {
    /* styles */
}

.custom-tree-cell-sad {
   /* styles */
}