2017-02-05 4 views
0

Я создаю Shape и мне нужно move в horizontal position на Canvas, то есть на x-axis, без использования timelineПеремещение фигур в оси х с OnMouseMoved на холсте в JavaFX

Class Square нарисовать квадрат и вставить в canvas положение

public class Square{ 
    //calculate the position of the rand column to 
    //draw and insert in the position of the canvas 
    public void drawSquare(GraphicsContext gc) { 
     //Square Shadow 
     //gc.rect(posX, posY, w, h); 
     gc.rect(1, 53, 50, 50); 
     gc.fill(); 
     gc.beginPath(); 
     //Square 
     gc.beginPath(); 
     gc.setFill(Color.WHITE); 
     gc.setStroke(Color.BLACK); 
     gc.setLineWidth(2); 
     //gc.rect(posX, posY, w, h); 
     gc.rect(1, 53, 48, 48); 
     gc.fill(); 
     gc.stroke(); 

    } 
} 

Новый Canvas instance с height = 450 и width = 600

Canvas canvas = new Canvas(); 
canvas.setHeight(450); 
canvas.setWidth(600); 

и GraphicsContext к draw square

GraphicsContext gc = canvas.getGraphicsContext2D(); 

shape является create и draw square

Square square= new Square(); 
square.drawSquare(gc); 

и пример drawSquare с canvas

и mouse event к move square на canvas на X-Axis, я сделал что-то , но он не работает, может быть, может иметь другое решение

canvas.setOnMouseMoved((MouseEvent event) -> { 
//select the square and move on x-axis 
}); 

Любое предложение?

+1

ли что-то еще нарисованы на вашем 'Canvas'? Вам также может быть полезно использовать ['Rectangle'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/Rectangle.html). Если вы прикрепляете слушателя к своему холсту, вам нужно будет проверить, что мышь находится на прямоугольнике, удерживая трек или когда он был в последний раз нарисован. Использование 'Rectangle' спасет вас от этой проблемы. Кроме того, вместо рисования 'Path' было бы намного проще использовать метод GraphicsContext # strokeRect'. – MikaelF

+0

Я хотел что-то сказать, но я помню свое дело. :) – Elltz

ответ

1

Постарайся это (основе из MikaelF)

public class Main extends Application { 
@Override 
public void start(Stage primaryStage) { 
    try { 
     Rectangle rectBound = new Rectangle(); 
     BorderPane root = new BorderPane(); 
     Scene scene = new Scene(root,400,400); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     Canvas c = new Canvas(400,400); 

     root.setCenter(c); 
     c.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() { 
      boolean shouldDraw = false; 
      double dX,dY; 

      @Override 
      public void handle(MouseEvent arg0) { 
       if (arg0.getEventType() == MouseEvent.MOUSE_PRESSED) { 
        shouldDraw = rectBound.contains(arg0.getX(), arg0.getY()); 
        if (shouldDraw) { 
         dX = arg0.getX(); 
         dY = arg0.getY(); 
        } 
       } else if (arg0.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
        if (shouldDraw) { 
         double x = (arg0.getX() + rectBound.getX() - dX), 
           y = (arg0.getY() + rectBound.getY() - dY); 

         c.getGraphicsContext2D().clearRect(rectBound.getX(), 
           rectBound.getY(), rectBound.getWidth(),//50 
           rectBound.getHeight()); 

         rectBound.setY(y); 
         rectBound.setX(x); 

         dX = arg0.getX(); 
         dY = arg0.getY(); 
        } 
       } 
      } 
     }); 

     c.getGraphicsContext2D().setFill(Color.AQUAMARINE); 
     rectBound.xProperty().addListener(new ChangeListener<Number>(){//since they go together 
      @Override 
      public void changed(ObservableValue<? extends Number> arg0, 
        Number arg1, Number arg2) { 
       c.getGraphicsContext2D().fillRect(rectBound.getX(),rectBound.getY(), 
         rectBound.getWidth(),rectBound.getHeight()); //just an example 
      } 

     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
     rectBound.setWidth(50);rectBound.setHeight(50); 
     rectBound.setY(50);rectBound.setX(10);//because of the listener x is last 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

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

Это может быть альтернативным средством, остерегайтесь это грубая работа