@Override
 protected void setUpGroup(Group g) {
   g.setOnMousePressed(MouseEvent::consume);
 }
  private Scene createScene() {
    final Group group = new Group();
    Scene scene = new Scene(group);

    final TestNode node1 = new TestNode(300, 300, "node1");
    final TestNode node2 = new TestNode(500, 200, "node2");
    final TestNode node3 = new TestNode(80, 100, "node3");
    final TestNode node4 = new TestNode(650, 500, "node4");
    connectNodes(node1, node2);
    connectNodes(node1, node3);
    connectNodes(node2, node3);
    connectNodes(node1, node4);

    ArrayList<Node> array = new ArrayList<Node>();
    for (Edge n : node1.lines) array.add(n.line);
    for (Edge n : node2.lines) array.add(n.line);
    for (Edge n : node3.lines) array.add(n.line);
    for (Edge n : node4.lines) array.add(n.line);
    LinkedHashSet<Node> lhs = new LinkedHashSet<Node>();
    lhs.addAll(array); // Remove duplicates
    array.clear();
    array.addAll(lhs);

    array.add(node1.circle);
    array.add(node1.text);
    array.add(node2.circle);
    array.add(node2.text);
    array.add(node3.circle);
    array.add(node3.text);
    array.add(node4.circle);
    array.add(node4.text);

    Collection<Node> c = array;

    // Won't work with JavaFX 2.2 ->
    // group.getChildren().add(new Group(c));

    group
        .getChildren()
        .add(
            new Group(
                // edge1.line, edge2.line, edge3.line, edge4.line,
                node1.circle, node1.text,
                node2.circle, node2.text,
                node3.circle, node3.text,
                node4.circle, node4.text));

    group.setOnMousePressed(
        new EventHandler<MouseEvent>() {
          @Override
          public void handle(MouseEvent event) {
            lastX = event.getX();
            lastY = event.getY();
            if (ITERATION == 0) changePosition(node1, 100, 500); // TEMPORARY; FOR TESTING
            if (ITERATION == 1) changePosition(node2, 300, 200); // TEMPORARY; FOR TESTING
            if (ITERATION == 2) changePosition(node3, 600, 300); // TEMPORARY; FOR TESTING
            if (ITERATION == 3) changePosition(node4, 300, 530); // TEMPORARY; FOR TESTING
            if (ITERATION == 4) changePosition(node1, 500, 100); // TEMPORARY; FOR TESTING
            if (ITERATION == 5) changePosition(node1, 400, 350); // TEMPORARY; FOR TESTING
            if (ITERATION == 6) changePosition(node2, 200, 150); // TEMPORARY; FOR TESTING
            if (ITERATION == 6) changePosition(node3, 700, 200); // TEMPORARY; FOR TESTING
            ++ITERATION; // TEMPORARY; FOR TESTING
          }
        });

    group.addEventHandler(
        ZoomEvent.ZOOM_STARTED,
        new EventHandler<ZoomEvent>() {
          @Override
          public void handle(ZoomEvent event) {
            startScale = group.getScaleX();
            group.setScaleX(startScale);
            // group.setScaleY(startScale); // Is this necessary? Apparently not.
          }
        });
    group.addEventHandler(
        ZoomEvent.ZOOM,
        new EventHandler<ZoomEvent>() {
          @Override
          public void handle(ZoomEvent event) {
            group.setScaleX(startScale * event.getTotalZoomFactor());
            group.setScaleY(startScale * event.getTotalZoomFactor());
          }
        });

    // TODO: Adjust the text after rotation?

    group.addEventHandler(
        RotateEvent.ROTATION_STARTED,
        new EventHandler<RotateEvent>() {
          @Override
          public void handle(RotateEvent event) {
            startRotate = group.getRotate();
            group.setRotate(startRotate);
          }
        });
    group.addEventHandler(
        RotateEvent.ROTATE,
        new EventHandler<RotateEvent>() {
          @Override
          public void handle(RotateEvent event) {
            group.setRotate(startRotate + event.getTotalAngle());
          }
        });

    return scene;
  }