2016-12-04 10 views
2

現在、私はポリゴンを必要に応じてサイズ変更および整形することができます。問題は、ポリゴンを移動してアンカーポイントを固定したままポリゴンに移動しないと、本当に混乱して、誰かが私を助けたり案内したりすることを望んでいたことです。アンカーポイントはポリゴンに従わない - JavaFX

public Polygon createStartingFloorPlan(ActionEvent event) throws IOException { 
    Polygon fp = new Polygon(); 
    ObjectProperty<Point2D> mousePosition = new SimpleObjectProperty<>(); 
    fp.getPoints().setAll(
      150d, 50d, 
      450d, 50d, 
      750d, 50d, 
      750d, 350d, 
      750d, 650d, 
      450d, 650d, 
      150d, 650d, 
      150d, 350d 

    ); 

    fp.setOnMousePressed(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 
     } 
    }); 

    fp.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      double deltaX = event.getSceneX() - mousePosition.get().getX(); 
      double deltaY = event.getSceneY() - mousePosition.get().getY(); 
      fp.setLayoutX(fp.getLayoutX()+deltaX); 
      fp.setLayoutY(fp.getLayoutY()+deltaY); 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 
      createControlAnchorsFor(fp.getPoints()); 
     } 
    }); 

    fp.setStroke(Color.FORESTGREEN); 
    fp.setStrokeWidth(4); 
    fp.setStrokeLineCap(StrokeLineCap.ROUND); 
    fp.setFill(Color.CORNSILK.deriveColor(0, 1.2, 1, 0.6)); 
    container.getChildren().add(fp); 
    container.getChildren().addAll(createControlAnchorsFor(fp.getPoints())); 
    return fp; 
} 


private ObservableList<Anchor> createControlAnchorsFor(final ObservableList<Double> points) { 
    ObservableList<Anchor> anchors = FXCollections.observableArrayList(); 

    for (int i = 0; i < points.size(); i += 2) { 
     final int idx = i; 

     DoubleProperty xProperty = new SimpleDoubleProperty(points.get(i)); 
     DoubleProperty yProperty = new SimpleDoubleProperty(points.get(i + 1)); 

     xProperty.addListener(new ChangeListener<Number>() { 
      @Override 
      public void changed(ObservableValue<? extends Number> ov, Number oldX, Number x) { 
       points.set(idx, (double) x); 
      } 
     }); 

     yProperty.addListener(new ChangeListener<Number>() { 
      @Override 
      public void changed(ObservableValue<? extends Number> ov, Number oldY, Number y) { 
       points.set(idx + 1, (double) y); 
      } 
     }); 
     anchors.add(new Anchor(Color.GOLD, xProperty, yProperty)); 

    } 

    return anchors; 
} 

// a draggable anchor displayed around a point. 
class Anchor extends Circle { 
    private final DoubleProperty x, y; 

    Anchor(Color color, DoubleProperty x, DoubleProperty y) { 
     super(x.get(), y.get(), 10); 
     setFill(color.deriveColor(1, 1, 1, 0.5)); 
     setStroke(color); 
     setStrokeWidth(2); 
     setStrokeType(StrokeType.OUTSIDE); 

     this.x = x; 
     this.y = y; 

     x.bind(centerXProperty()); 
     y.bind(centerYProperty()); 
     enableDrag(); 
    } 

    // make a node movable by dragging it around with the mouse. 
    private void enableDrag() { 
     final Delta dragDelta = new Delta(); 
     setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       // record a delta distance for the drag and drop operation. 
       dragDelta.x = getCenterX() - mouseEvent.getX(); 
       dragDelta.y = getCenterY() - mouseEvent.getY(); 
       getScene().setCursor(Cursor.MOVE); 
      } 
     }); 
     setOnMouseReleased(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       getScene().setCursor(Cursor.HAND); 
      } 
     }); 
     setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       double newX = mouseEvent.getX() + dragDelta.x; 
       if (newX > 0 && newX < getScene().getWidth()) { 
        setCenterX(newX); 
       } 
       double newY = mouseEvent.getY() + dragDelta.y; 
       if (newY > 0 && newY < getScene().getHeight()) { 
        setCenterY(newY); 
       } 
      } 
     }); 
     setOnMouseEntered(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if (!mouseEvent.isPrimaryButtonDown()) { 
        getScene().setCursor(Cursor.HAND); 
       } 
      } 
     }); 
     setOnMouseExited(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if (!mouseEvent.isPrimaryButtonDown()) { 
        getScene().setCursor(Cursor.DEFAULT); 
       } 
      } 
     }); 
    } 

    // records relative x and y co-ordinates. 
    private class Delta { 
     double x, y; 
    } 

} 

通報

enter image description here
+0

私はあなたがこの例を使用し、[jewelsea例](https://gist.github.com/jewelsea/5375786)、それだと仮定それを適応させるのはあまり複雑ではありません。ポリゴンのポイント数を増やしただけです。 –

+1

ええ、それは私の質問に答えることはできません、あなたはそれを移動するときにアンカーポイントをポリゴンに追従させることができますか? jewelseaの例では、ポリゴンを移動する機能はありませんでした。 – TheBeliever12

+0

ポリゴンをドラッグするとポイントも移動するように双方向バインディングを作成します。 –

答えて

2

Polygonの点が描かれている座標がノードに印加されていない変換が存在しない(layoutX + pointX, layoutY + pointY)仮定されます。

AnchorlayoutXlayoutYのプロパティは決して調整しません。この問題を解決するには、Polygonのプロパティにバインドすることができます。

private ObservableList<Anchor> createControlAnchorsFor(Polygon polygon, final ObservableList<Double> points) { 
    ... 

    Anchor anchor = new Anchor(Color.GOLD, xProperty, yProperty); 

    anchor.layoutXProperty().bind(polygon.layoutXProperty()); 
    anchor.layoutYProperty().bind(polygon.layoutYProperty()); 

    anchors.add(anchor); 

    ... 

} 

をさらに私は、カスタムDoublePropertyクラスを使用する代わりに、リスナーにSimpleDoubleProperty Sを使用することをお勧めします。このことにより、あなたはもう少し読みやすく、また、コードを作るため、座標1つのあたりでオブジェクトの数を減らす:

private static class ListWriteDoubleProperty extends SimpleDoubleProperty { 
    private final ObservableList<Double> list; 
    private final int index; 

    public ListWriteDoubleProperty(ObservableList<Double> list, int index) { 
     super(list.get(index)); 
     this.list = list; 
     this.index = index; 
    } 

    @Override 
    protected void invalidated() { 
     list.set(index, get()); 
    } 

} 
DoubleProperty xProperty = new ListWriteDoubleProperty(points, i); 
DoubleProperty yProperty = new ListWriteDoubleProperty(points, i + 1); 
// no more listeners/final index copy required... 
+0

ありがとうございました!あなたの最高! :) – TheBeliever12

関連する問題