我正在尝试为二进制搜索树编写一个程序,该程序会将圆圈放在JavaFX的窗格中,然后将圆圈与一行连接起来,使其看起来像 二进制搜索树。我可以使圆出现在窗格中,但是正在创建的线保持在顶部,并且不会从父圆的中心到新圆的中心。我也希望文本在圆圈内居中,但我也无法使其正常工作。我在下面将我的代码以及我的输出和所需的输出一起发布了。
public boolean addNode(T addMe) {
boolean added = false;
MyNode current = root;
MyNode node = new MyNode(addMe,null,null);
if (root == null) {
root = node;
added = true;
} else {
while (added != true) {
if (addMe.compareTo(current.info) < 0) {
if (current.left == null) {
current.left = new MyNode(addMe,null);
added = true;
} else {
current = current.left;
}
} else {
if (current.right == null) {
current.right = new MyNode(addMe,null);
added = true;
} else {
current = current.right;
}
}
}
}
node.label = new Text("" + addMe);
node.label.setfont(new Font(16));
node.circle = encircle(node.label,node);
node.label.xProperty().bind(node.circle.centerXProperty());
node.label.yProperty().bind(node.circle.centerYProperty());
node.edge = new Line();
if(node != root) {
node.edge.startXProperty().bind(current.circle.centerXProperty());
node.edge.endXProperty().bind(node.circle.centerXProperty());
}
this.getchildren().add(node.edge);
node.edge.toBack();
node.circle.setOnmouseDragged(evt -> {
double mouseX = evt.getX(),mouseY = evt.getY();
node.circle.setCenterX(mouseX);
node.circle.setCenterY(mouseY);
});
this.getchildren().addAll(node.circle,node.label);
return added;
}
private Circle encircle(Text text,MyNode node) {
node.circle = new Circle();
node.circle.setfill(Color.WHITE);
final double PADDING = 10;
node.circle.setRadius(getWidth(text) / 2 + PADDING);
if (node == root) {
node.circle.setStroke(Color.RED);
} else {
node.circle.setStroke(Color.BLACK);
}
return node.circle;
}
private int getWidth(Text text) {
new Scene(new Group(text));
text.applyCss();
return (int) text.getLayoutBounds().getWidth();
}
我的输出:My Output 所需的输出:Desired Output