2012-05-07 26 views
0

javafxで丸い角を描いた単純な四角形をマウスのドラッグ中に描画しようとしています。 最初の問題:左上隅を丸くすることはできません。 2番目の問題:私のアプリケーションは、私の写真の2番目のものとは違う、すてきな丸い四角形を描くことができるようにしたい。 どうすればこれらを修正できますか? ご協力いただきありがとうございます。ここドラッグ中に丸みを帯びた四角形を描く

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class Main extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public void start(Stage stage){ 
     stage.setTitle("Test");   
     root = new BorderPane();  
     Scene scene = new Scene(root, 400, 400); 
     paintings = new Group(); 
     stage.setScene(scene); 

     canvas = new Rectangle(0, 0, stage.getScene().getWidth(), stage.getScene().getHeight()); 
     canvas.setFill(Color.WHITE); 

     addHandlers(); 

     root.setCenter(canvas); 
     root.getChildren().add(paintings); 
     stage.show(); 
    } 

    private void paintRectangle(){ 
     roundedRect = new Rectangle(pressedX, 
        pressedY, 
        draggedX - pressedX, 
        draggedY - pressedY); 
     roundedRect.setFill(Color.RED); 
     roundedRect.setArcHeight(40); 
     roundedRect.setArcWidth(40);   
     paintings.getChildren().add(roundedRect); 
    } 

    private void addHandlers(){ 
    canvas.setOnMousePressed(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent me) {     
       pressedX = me.getX(); 
       pressedY = me.getY(); 
      } 
     }); 

    canvas.setOnMouseReleased(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent me) {     
       /* If I make the drawing in here, I get round corners, but it doesn't get drawn while dragging*/ 
       //paintRectangle(); 
      } 
     }); 

     canvas.setOnMouseDragged(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent me) {     
       draggedX = me.getX(); 
       draggedY = me.getY(); 
       paintRectangle(); 

      } 
     }); 
    } 
    double pressedX, pressedY; 
    double draggedX, draggedY; 
    Rectangle canvas; 
    Group paintings; 
    Rectangle roundedRect; 
    BorderPane root; 

} 

そして、私の絵です: not the rounded rectangles that I expected

答えて

3

私はあなたのコードを調べることができませんでしたが、しかし、ここで別のアプローチである

は、ここに私のコードです。これをコードにマージすることができます。

import javafx.application.Application; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class Daer extends Application { 

    BorderPane pane; 
    Rectangle rect; 
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectinitY = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 

    @Override 
    public void start(Stage stage) { 

     pane = new BorderPane(); 
     Scene scene = new Scene(pane, 800, 600); 
     stage.setScene(scene); 

     scene.setOnMouseDragged(mouseHandler); 
     scene.setOnMousePressed(mouseHandler); 
     scene.setOnMouseReleased(mouseHandler); 

     rect = getNewRectangle(); 
     rect.widthProperty().bind(rectX.subtract(rectinitX)); 
     rect.heightProperty().bind(rectY.subtract(rectinitY)); 
     pane.getChildren().add(rect); 
     stage.show(); 
    } 

    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent mouseEvent) { 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
       rect.setX(mouseEvent.getX()); 
       rect.setY(mouseEvent.getY()); 
       rectinitX.set(mouseEvent.getX()); 
       rectinitY.set(mouseEvent.getY()); 
      } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
       rectX.set(mouseEvent.getX()); 
       rectY.set(mouseEvent.getY()); 
      } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) { 
       // Clone the rectangle 
       Rectangle r = getNewRectangle(); 
       r.setX(rect.getX()); 
       r.setY(rect.getY()); 
       r.setWidth(rect.getWidth()); 
       r.setHeight(rect.getHeight()); 
       pane.getChildren().add(r); 

       // Hide the rectangle 
       rectX.set(0); 
       rectY.set(0); 
      } 
     } 
    }; 

    private Rectangle getNewRectangle() { 
     Rectangle r = new Rectangle(); 
     r.setFill(Color.web("blue", 0.1)); 
     r.setStroke(Color.BLUE); 
     r.setArcHeight(40); 
     r.setArcWidth(40); 
     return r; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

ありがとうございました。それは働いています(矩形と円の場合)が、ポリゴンに含まれる各頂点のプロパティを持たないため、ポリゴンには機能しません。ポリゴンポイントをバインドする方法も知っていますか?ありがとうございました。 –

+0

丸い角と曲線のパスを持つ複雑な形状の@Carmenでは、SVGPathを使用する必要があります。 [ここ](http://www.w3.org/TR/SVG/paths.html)を参照してください。 –

関連する問題