2013-11-18 1 views
0

Я новичок в анимации JavaFX. Я пытаюсь использовать следующий код в качестве пробной версии для другого крупного проекта; В основном я хочу перемещать круги с помощью перетаскивания мышью, , когда круг над прямоугольником, выделите прямоугольник. Если круг опускается на прямоугольник, измените его цвет на цвет круга.реализация перетаскивания для фигур JavaFX

До сих пор мне удалось перемещать круг с помощью мыши, но я не уверен, почему метод OnDragEntered прямоугольника ничего не делает.

Вот FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?import javafx.scene.shape.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.sc.colordx.controller.D15Controller"> 
    <children> 
<Rectangle fx:id="r1" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="33.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" pickOnBounds="true" stroke="BLACK" strokeType="INSIDE" width="52.5" /> 
<Rectangle fx:id="r2" arcHeight="5.0" arcWidth="5.0" fill="WHITE" height="152.0" layoutX="91.0" layoutY="14.0" onDragDropped="#fillBox" onDragEntered="#highlightBox" stroke="BLACK" strokeType="INSIDE" width="52.5" /> 
<Circle fx:id="c1" fill="DODGERBLUE" layoutX="348.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" /> 
<Circle id="c1" fx:id="c2" fill="#ff3d00" layoutX="217.0" layoutY="262.0" onDragDetected="#startDrag" onMouseDragged="#moveCircle" onMouseReleased="#removeBind" radius="54.5" stroke="BLACK" strokeType="INSIDE" /> 
    </children> 
</AnchorPane> 

А вот контроллер:

пакет com.sc.colordx.controller;

import java.awt.Point; 
    import java.net.URL; 
    import java.util.ResourceBundle; 
    import javafx.animation.TranslateTransition; 
    import javafx.fxml.FXML; 
    import javafx.fxml.Initializable; 
    import javafx.scene.input.DragEvent; 
    import javafx.scene.input.MouseEvent; 
    import javafx.scene.shape.Circle; 
    import javafx.scene.shape.Rectangle; 
    import javafx.util.Duration; 


     public class D15Controller implements Initializable { 
     @FXML 
     private Circle c1; 
     @FXML 
     private Rectangle r1; 

     // Animation Data 
     private static final Duration TRANSLATE_DURATION  = Duration.seconds(0.25); 
     private TranslateTransition transition; 
     @FXML 
     private Circle c2; 
     @FXML 
     private Rectangle r2; 
     /** 
     * Initializes the controller class. 
     */ 
     @Override 
     public void initialize(URL url, ResourceBundle rb) 
     { 
      // TODO 
      transition = createTranslateTransition(c1); 


     }  
     private TranslateTransition createTranslateTransition(final Circle circle) { 
     final TranslateTransition transition = new TranslateTransition(TRANSLATE_DURATION, circle); 

     return transition; 
     } 

     @FXML 
     private void removeBind(MouseEvent event) 
     { 
      if(event.getSource() instanceof Circle) 
      { 
       Circle circle = (Circle)event.getSource(); 
       circle.setOpacity(1); 
      } 
     } 

      private void fillBox(DragEvent event) 
     { 
      System.out.println("Drag detected"); 
      if(event.getGestureTarget() instanceof Rectangle) 
      { 
       Rectangle target=(Rectangle)event.getGestureTarget(); 
       Circle source=(Circle)event.getGestureSource(); 
       target.setFill(source.getFill()); 
      } 
     } 
      @FXML 
     private void moveCircle(MouseEvent event) 
     { 
      Circle circle=null; 
      event.setDragDetect(true); 

      if(event.getSource() instanceof Circle) 
      { 

       circle=(Circle)event.getSource(); 

       circle.setOpacity(0.25); 
       if (!event.isControlDown()) 
       { 
        circle.setCenterX(event.getX()); 
        circle.setCenterY(event.getY()); 
       } 
       else 
       { 
        transition.setToX(circle.getCenterX()); 
        transition.setToY(circle.getCenterY()); 
        transition.playFromStart(); 
       } 
      } 


     } 

     @FXML 
     private void startDrag(MouseEvent event) 
     { 
      if(event.getSource() instanceof Circle) 
      { 
       Circle source=(Circle)event.getSource(); 
       source.startFullDrag(); 
      } 
     } 
     @FXML 
      private void highlightBox(DragEvent event) 
     { 
      System.out.println("Highlight box"); 
      if(event.getGestureSource() instanceof Circle) 
      { 
       Circle source=(Circle)event.getGestureSource(); 
       Rectangle target=(Rectangle)event.getGestureTarget(); 
       target.setFill(source.getFill()); 
      } 
     } 
    } 

Это правильный подход? Или я неправильно перемешиваю перетащить & капля с анимацией? Для тех, кто задается вопросом об использовании этого, его начало для реализации теста цветной слепоты.

ответ

7

Ну, я давно понял проблему. Но не успел обновить ответ здесь. Хотя я должен сказать, что отсутствие единого ответа удивительно.

следующие строки должны присутствовать в методе moveCircle():

1. circle.setMouseTransparent(true); 

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

2. event.consume(); 

обеспечивает, что это событие потребляется, и событие отслеживания перетаскивания может зависеть. Метод highlightbox должен содержать:

event.acceptTransferModes(TransferMode.ANY); 

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

+0

Благодарим за сообщение о решении вашей проблемы, высоко ценим! – ljgw