我想制作一个带有可拖动节点的窗格.当我选择一些节点时,我想为这个节点绘制一些边框.实际上,我已经完成了,但我的麻烦是,我的解决方案从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());
});
Run Code Online (Sandbox Code Playgroud)
}
我已经看过很多教程如何在javaFx中使用css,但我不明白如何解决我的问题.
Jam*_*s_D 13
给你要拖动一些固定样式类的所有节点:
private static final String DRAGGABLE_CLASS = "draggable" ;
// ...
Node node = ... ;
node.getStyleClass().add(DRAGGABLE_CLASS);
Run Code Online (Sandbox Code Playgroud)
现在定义一个"选定的"伪类:
private static final PseudoClass SELECTED_PSEUDO_CLASS =
PseudoClass.getPseudoClass("selected");
Run Code Online (Sandbox Code Playgroud)
然后做:
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());
});
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用以下命令定义外部CSS文件:
.draggable {
/* styles for all draggable nodes */
}
.draggable:selected {
-fx-border-width: 2;
-fx-border-color: gray;
-fx-border-style: solid;
}
Run Code Online (Sandbox Code Playgroud)