2013-07-06 2 views
0

Я использую этот код для рисования прямоугольника при перетаскивании мыши. Проблема в том, что я могу рисовать только слева направо.Рисование прямоугольника во всех направлениях с ошибкой javaFX

Вот мой код:

public class functionalTest extends Application { 

    BorderPane pane; 
    Rectangle rect; 
    Group group; 
    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); 

     group = new Group(); 
     Circle circle = new Circle(200, 200, 25); 
     circle.setFill(Color.HOTPINK); 
     group.getChildren().add(circle); 

     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); 
     pane.getChildren().add(group); 
     stage.show(); 

     ArrayList<Node> containedNodesArray = new ArrayList<Node>(); 
     containedNodesArray = Main.dragBoxSelection(group, rect); 

     if (containedNodesArray.size() > 0) { 
      System.out.println("Success"); 
     } 
    } 

    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()); 
       System.out.println("RECTX"+rectX.getValue()); 
       System.out.println("RECTY"+rectY.getValue()); 
       ArrayList<Node> containedNodesArray = new ArrayList<Node>(); 
       containedNodesArray = Main.dragBoxSelection(group, rect); 

       if (containedNodesArray.size() > 0) { 
        System.out.println("Success"); 
       } 
      } 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); 

     return r; 
    } 

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

Пожалуйста, кто может помочь мне сделать в других direcions справа до влево, влево вправо вверх и вправо вниз, чтобы он ушел.

+0

У меня есть разработать графический редактор в JavaFX для нарисовать прямоугольник во всех направлениях, вы просто должны иметь отражение в определить, откуда, куда идти моя мышь. У меня нет исходного кода, извините, но это не совсем завершено. –

+0

Извините, но я попробовал разные решения, чтобы получить направление моей мыши и установить правильную высоту и ширину, но все те испытания, где произошел сбой. Можете ли вы просто дать мне подсказку или попытаться отправить мне исходный код? – MaryamB

ответ

1

Это то, что вам нужно сделать:

Когда мышь перетаскивается: получить dx = mouseEvent.getX() - initial X; если dx < 0, то вам нужно setTranslateX(dx) и setWidth(-dx) еще setTranslateX(0) и setWidth(dx)

Сделайте то же самое для Y координат, однако на этот раз использование высоты не ширины;

Это все.

0

я заменил код выглядеть так: EventHandler mouseHandler = новый EventHandler() {

@Override 
    public void handle(MouseEvent mouseEvent) { 

     if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
      rectinitX.set(mouseEvent.getX()); 
      rectinitY.set(mouseEvent.getY()); 
     } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
      Double width = mouseEvent.getX() - rectinitX.getValue(); 
      if (width < 0) { 
       rectX.set(mouseEvent.getX()); 
       rect.setTranslateX(width); 
       rect.widthProperty().bind(rectinitX.subtract(rectX)); 
       System.out.println(rect.getWidth()); 
      } else { 
       rectX.set(mouseEvent.getX()); 
       rect.setTranslateX(0); 
       rect.widthProperty().bind(rectX.subtract(rectinitX)); 
      } 

     } 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); 


     } 
    } 
}; 

Я только хотел попробовать свое решение для ширины vaues на первый, но это не похоже на работу , Есть ли у вас замечания относительно моей реализации?

0

Вам не нужны параметры высоты.

  if (event.getEventType() == MouseEvent.MOUSE_PRESSED) { 
      rect.setX(event.getX()); 
      rect.setY(event.getY()); 
      rectinitX.set(event.getX()); 
      rectinitY.set(event.getY()); 
     } else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
      Double dx = event.getX() - rectinitX.getValue(); 
      Double dy = event.getY() - rectinitY.getValue(); 
      if (dx < 0) { 
       rectX.set(event.getX()); 
       rect.setTranslateX(dx); 
       rect.widthProperty().bind(rectinitX.subtract(rectX)); 
      } else { 
       rectX.set(event.getX()); 
       rect.setTranslateX(0); 
       rect.widthProperty().bind(rectX.subtract(rectinitX)); 
      } 
      if(dy < 0) { 
       rectY.set(event.getY()); 
       rect.setTranslateY(dy); 
       rect.heightProperty().bind(rectinitX.subtract(rectX)); 
      } else { 
       rectY.set(event.getY()); 
       rect.setTranslateY(0); 
       rect.heightProperty().bind(rectY.subtract(rectinitY)); 
      } 

     } else if (event.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); 
    }}}}; 

Это точный код для рисования в разных направлениях, кроме работы, к сожалению, это не распространяется слева направо снизу справа вверху, и я не могу понять это. Работает отлично по умолчанию aka слева направо, но при рисовании справа налево появляется ошибка кода. Если кто-то может понять это, я буду быть много appricated

0

следует читать

if(dy < 0) 
{ 
    rectY.set(mouseEvent.getY()); 
    rect.setTranslateY(dy); 
    rect.heightProperty().bind(rectinitY.subtract(rectY)); 
} 
Смежные вопросы