可以在javaFx中为Node对象添加css类吗?

时间:2016-01-22 19:09:24

标签: java css javafx

我想制作一个包含可拖动节点的窗格。当我选择一些节点时,我想为这个节点绘制一些边框。实际上,我已经完成了,但我的麻烦是,我的解决方案从Node中删除了所有其他样式。这是非常难看的解决方案。我想通过添加css类来实现它,但我绝对不知道该怎么做。当节点的焦点丢失时,我想删除css类。我是JavaFx的新手。我的代码如下:

public void addSelectionControlToNode(Node node) {
node.addEventFilter(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
    if (e.isControlDown()) {
        if (selection.contains(node)) {
            selection.remove(node);
        } else {
            selection.add(node);
            //problematic area below
            node.setStyle("-fx-border-width: 2;
               -fx-border-color: gray; -fx-border-style: solid;");
           //problematic area end
        }
    } else {
        selection.clear();
        selection.add(node);
    }
    System.out.println(selection.size());
});

}

enter image description here

我已经看过很多教程如何在javaFx中使用css,但我不明白如何解决我的问题。

1 个答案:

答案 0 :(得分:13)

使用CSS Pseudoclass

给你要拖动一些固定样式类的所有节点:

private static final String DRAGGABLE_CLASS = "draggable" ;

// ...

Node node = ... ;
node.getStyleClass().add(DRAGGABLE_CLASS);

现在定义一个"选择"伪类:

private static final PseudoClass SELECTED_PSEUDO_CLASS =
    PseudoClass.getPseudoClass("selected");

然后做:

public void addSelectionControlToNode(Node node) {
    node.addEventFilter(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
        if (e.isControlDown()) {
            if (selection.contains(node)) {
                selection.remove(node);
                node.pseudoClassStateChanged(SELECTED_PSEUDO_CLASS, false);
            } else {
                selection.add(node);
                node.pseudoClassStateChanged(SELECTED_PSEUDO_CLASS, true);
            }
        } else {
            selection.clear();
            selection.add(node);
            node.pseudoClassStateChanged(SELECTED_PSEUDO_CLASS, true);
        }
        System.out.println(selection.size());
    });
}

现在您可以使用以下命令定义外部CSS文件:

.draggable {
    /* styles for all draggable nodes */
}
.draggable:selected {
    -fx-border-width: 2;
    -fx-border-color: gray; 
    -fx-border-style: solid;
}