Instructions
Requirements and Specifications
Source Code
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.layout.*;
import javafx.scene.*;
import javafx.scene.input.*;
import java.util.Random;
import javafx.scene.control.*;
public class MyLab9 extends Application {
public static final int SCENE_WIDTH = 1024;
public static final int SCENE_HEIGHT = 640;
public static final int MAX_VALUE = Short.MAX_VALUE;
public void start(Stage primaryStage)
{
Pane pane = new Pane();
MyTreeSetLab9 myTree = new MyTreeSetLab9();
Random rand = new Random();
pane.setOnMouseClicked(evt -> {
if (evt.getButton() == MouseButton.SECONDARY) {
int rint = rand.nextInt(MAX_VALUE);
System.out.print("Adding " + rint + "...");
boolean result = myTree.add(rint);
System.out.println(result ? "good" : "bad");
System.out.println(myTree);
}
});
pane.getChildren().add(myTree);
Scene scene = new Scene(pane, SCENE_WIDTH, SCENE_HEIGHT);
primaryStage.setScene(scene);
primaryStage.setTitle("271 Lab-niner");
primaryStage.show();
}
}
TREE
import javafx.scene.layout.Pane;
import javafx.scene.shape.*;
import javafx.scene.paint.Color;
import javafx.scene.text.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
public class MyTreeSetLab9 extends Pane {
private MyNode root;
private class MyNode {
final T data;
final MyNode parent;
MyNode leftChild;
MyNode rightChild;
Circle circle;
Line edge;
Text text;
public MyNode(T data, MyNode parent) {
this.data = data;
this.parent = parent;
text = new Text(data.toString());
text.setFont(new Font(16));
Random random = new Random();
double textWidth = text.getLayoutBounds().getWidth();
double textHeight = text.getLayoutBounds().getHeight();
double radius = Math.max(30, text.getLayoutBounds().getWidth() / 2 + 5);
circle = new Circle(random.nextInt(MyLab9.SCENE_WIDTH), random.nextInt(MyLab9.SCENE_HEIGHT), radius);
circle.setFill(Color.WHITE);
circle.setStroke(parent == null ? Color.RED : Color.BLACK);
MyTreeSetLab9.this.getChildren().add(circle);
circle.setOnMouseDragged(evt -> {
double mouseX = evt.getX(),
mouseY = evt.getY();
circle.setCenterX(mouseX);
circle.setCenterY(mouseY);
});
text.xProperty().bind(circle.centerXProperty().subtract(textWidth / 2));
text.yProperty().bind(circle.centerYProperty().add(textHeight / 4));
MyTreeSetLab9.this.getChildren().add(text);
if (parent != null) {
edge = new Line();
edge.startXProperty().bind(parent.circle.centerXProperty());
edge.startYProperty().bind(parent.circle.centerYProperty());
edge.endXProperty().bind(circle.centerXProperty());
edge.endYProperty().bind(circle.centerYProperty());
MyTreeSetLab9.this.getChildren().add(edge);
edge.toBack();
}
}
}
public boolean add(T addMe) {
if (root == null) {
root = new MyNode(addMe, null);
return true;
}
Random random = new Random();
int bits = 0;
MyNode currentNode = root;
for (int parentLevel = 0; ; parentLevel++) {
if (parentLevel % 8 == 0) {
bits = random.nextInt();
}
if ((bits & 1) == 0) {
if (currentNode.leftChild == null) {
currentNode.leftChild = new MyNode(addMe, currentNode);
break;
}
currentNode = currentNode.leftChild;
} else {
if (currentNode.rightChild == null) {
currentNode.rightChild = new MyNode(addMe, currentNode);
break;
}
currentNode = currentNode.rightChild;
}
bits = bits >> 1;
}
return true;
}
@Override
public String toString() {
List nodesPreOrder = new ArrayList<>();
collectPreOrderTraversal(nodesPreOrder, root);
return "[" +
nodesPreOrder.stream().map(node -> node.data.toString()).collect(Collectors.joining(", ")) +
"]";
}
private void collectPreOrderTraversal(List collection, MyNode current) {
if (current != null) {
collection.add(current);
collectPreOrderTraversal(collection, current.leftChild);
collectPreOrderTraversal(collection, current.rightChild);
}
}
}