2012-08-03 91 views
3

我正在创建一个简单的javafx应用程序。我只想从两个同心圆之间的区域内剪切图像,这会改变鼠标移动中的中心坐标,粘贴的对象出现在初始定义的位置,但它不响应鼠标移动。请告诉我我做错了什么。使用复杂形状的javafx剪辑蒙版

我的代码是:

public DoubleProperty xCordinate; 
public DoubleProperty yCordinate; 

@Override 
public void start(Stage primaryStage) { 

    Group root = new Group(); 
    Image image = new Image(MyClass.class 
      .getResource("Water lilies.jpg").toExternalForm()); 
    Scene scene = new Scene(root, image.getWidth(), image.getHeight(), 
      Color.WHITE); 
    ImageView view = new ImageView(); 
    view.setImage(image); 
    xCordinate = new SimpleDoubleProperty(100.0f); 
    yCordinate = new SimpleDoubleProperty(100.0f); 
    scene.setOnMouseMoved(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      xCordinate.set(event.getX()); 
      yCordinate.set(event.getY()); 
      System.out.println("xCordinate " + xCordinate + " yCordinate " 
        + yCordinate); 
     } 

    }); 

    Circle c1 = new Circle(); 
    c1.centerXProperty().bind(xCordinate); 
    c1.centerYProperty().bind(yCordinate); 
    c1.setRadius(50.0f); 
    Circle c2 = new Circle(); 
    c2.centerXProperty().bind(xCordinate); 
    c2.centerYProperty().bind(yCordinate); 
    c2.setRadius(35.0f); 

    Shape mask = Path.subtract(c1, c2); 

    view.setClip(mask); 
    root.getChildren().add(view); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

回答

5

您需要更新圈子位置的每一个变化的面具剪辑。顺便说一下好的应用程序。

@Override 
    public void start(Stage primaryStage) { 
     Group root = new Group(); 
     Image image = new Image(MyClass.class.getResource("Water lilies.jpg").toExternalForm()); 
     Scene scene = new Scene(root, image.getWidth(), image.getHeight(), Color.WHITE); 
     final ImageView view = new ImageView(); 
     view.setImage(image); 

     xCordinate = new SimpleDoubleProperty(100.0f); 
     yCordinate = new SimpleDoubleProperty(100.0f); 


     final Circle c1 = new Circle(); 
     c1.centerXProperty().bind(xCordinate); 
     c1.centerYProperty().bind(yCordinate); 
     c1.setRadius(50.0f); 

     final Circle c2 = new Circle(); 
     c2.centerXProperty().bind(xCordinate); 
     c2.centerYProperty().bind(yCordinate); 
     c2.setRadius(35.0f); 

     scene.setOnMouseMoved(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       xCordinate.set(event.getX()); 
       yCordinate.set(event.getY()); 
       System.out.println("xCordinate " + xCordinate + " yCordinate " + yCordinate); 
       // update mask clip 
       Shape mask = Path.subtract(c1, c2); 
       view.setClip(mask); 
      } 
     }); 

     Shape mask = Path.subtract(c1, c2); 
     view.setClip(mask); 

     root.getChildren().add(view); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    }