我想制作一个包含可拖动节点的窗格。当我选择一些节点时,我想为这个节点绘制一些边框。实际上,我已经完成了,但我的麻烦是,我的解决方案从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());
});
}
我已经看过很多教程如何在javaFx中使用css,但我不明白如何解决我的问题。
答案 0 :(得分:13)
给你要拖动一些固定样式类的所有节点:
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;
}