2012-12-31 15 views
6

Bardzo dziwny problem. W końcu udało mi się go wydestylować w małym kawałku kodu, który demonstruje problem. Mam okienko, które zawiera 1 grupę, która zawiera grupę zawierającą kilka elips. Górna grupa ma zastosowaną transformację rotacyjną. Elipsy są przeciągane.przeciąganie węzłów, gdy ich rodzic ma transformację, powoduje zniknięcie węzłów.

Spróbuj poniższego przykładu, przeciągnij elipsy w dół (poza granice grupy), zobaczysz, że znikają. Jeśli zmaksymalizujesz okno, pojawią się one ponownie, ale nie możesz ich już przeciągać, nie otrzymują już żadnych zdarzeń.

Teraz za bardzo dziwne strony, istnieją trzy sposoby mogę sprawić, że problem znika: (!?)

  1. nie mają zastosowania transformacji
  2. usunąć jedną elipsę (I eksperymentowali, aby uzyskać do tej liczby, 11)
  3. początek SCENICVIEW obok i wybierz grupę zawierającą elipsy, dzięki czemu można zobaczyć granice grupy

Mam tu totalną stratę, kompletnie oszołomiony. Czy ktoś ma pojęcie, dlaczego ten problem występuje i jak go rozwiązać?

Code (2.2.3 JavaFX i Java 1.7.0_09 64bit Windows 7):

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Point2D; 
import javafx.scene.Group; 
import javafx.scene.GroupBuilder; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.SceneBuilder; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.shape.Ellipse; 
import javafx.scene.shape.EllipseBuilder; 
import javafx.scene.transform.Rotate; 
import javafx.scene.transform.RotateBuilder; 
import javafx.stage.Stage; 

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

@Override 
public void start(Stage primaryStage) { 
    DrawingPane drawingPane = new DrawingPane(); 
    drawingPane.setStyle("-fx-background-color: darkgrey;"); 

    Scene scene = SceneBuilder.create().root(drawingPane).width(1280d).height(1024d).build(); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

public class DrawingPane extends Pane { 
    private Group transformedGroup; 
    private Group splinePoints; 

    public DrawingPane() { 
     transformedGroup = GroupBuilder.create().id("transformedGroup").build(); 

     getChildren().add(transformedGroup); 

     addPoints(); 
     makePointsDraggable(); 
    } 

    public void addPoints() { 
     double[] coords = new double[] { 
       // comment any one the below x,y coordinates and the problem doesn't occur.. 
       239.28353881835938, 488.2192687988281, 
       245.04466247558594, 505.30169677734375, 
       258.56671142578125, 539.49462890625, 
       267.2294006347656, 563.618408203125, 
       282.89141845703125, 587.84033203125, 
       309.6925048828125, 602.2174072265625, 
       327.4945068359375, 616.4683227539062, 
       345.25445556640625, 633.718994140625, 
       371.0416259765625, 649.0819702148438, 
       393.78704833984375, 667.402587890625, 
       442.67010498046875, 676.0886840820312 }; 

     splinePoints = GroupBuilder.create().build(); 
     for (int i = 0; i < coords.length; i += 2) { 
      Ellipse ellipse = EllipseBuilder.create().radiusX(3).radiusY(3).centerX(coords[i]).centerY(coords[i + 1]).build(); 
      splinePoints.getChildren().add(ellipse); 
     } 

     transformedGroup.getChildren().add(splinePoints); 

     Rotate rotateTransform = RotateBuilder.create().build(); 
     rotateTransform.setPivotX(224); 
     rotateTransform.setPivotY(437); 
     rotateTransform.setAngle(15); 

     // ..or comment this line to prevent the problem occuring 
     transformedGroup.getTransforms().add(rotateTransform); 
    } 

    public void makePointsDraggable() { 
     for (final Node n : splinePoints.getChildren()) { 
      Ellipse e = (Ellipse) n; 
      final NodeDragHandler ellipseDragHandler = new NodeDragHandler(e, transformedGroup); 

      e.setOnMousePressed(ellipseDragHandler); 
      e.setOnMouseDragged(ellipseDragHandler); 
     } 
    } 
} 

public class NodeDragHandler implements EventHandler<MouseEvent> { 
    protected final Ellipse node; 
    private final Node transformedGroup; 

    private double initialX; 
    private double initialY; 
    private Point2D initial; 
    private boolean dragStarted = false; 

    public NodeDragHandler(Ellipse node, Group transformedGroup) { 
     this.node = node; 
     this.transformedGroup = transformedGroup; 
    } 

    @Override 
    public void handle(MouseEvent event) { 
     if (!dragStarted) { 
      initialX = event.getScreenX(); 
      initialY = event.getScreenY(); 

      initial = transformedGroup.localToParent(new Point2D(node.getCenterX(), node.getCenterY())); 

      dragStarted = true; 
     } else { 
      double xDragged = event.getScreenX() - initialX; 
      double yDragged = event.getScreenY() - initialY; 

      Point2D newPos = new Point2D(initial.getX() + xDragged, initial.getY() + yDragged); 

      Point2D p = transformedGroup.parentToLocal(newPos.getX(), newPos.getY()); 

      node.setCenterX(p.getX()); 
      node.setCenterY(p.getY()); 
     } 
    } 
} 
} 
+0

Jeśli został uznany za błąd, czy nadal szukasz obejścia? W przeciwnym razie możesz odpowiedzieć na własne pytanie i zamknąć to. – JoshDM

+0

Próbowałem zamknąć to, ale nie mogłem znaleźć dobrego powodu pasującego w uzasadnieniu SO oferowanego. Nie jestem też pewien, co stanie się z otwartą nagródą, więc czekałem, aż wygasną. –

+0

Napisz własną odpowiedź na to pytanie, powołując się na potwierdzenie błędu. Następnie zaznacz swoją odpowiedź jako zaakceptowaną. Otrzymujesz zwrot pieniędzy. – JoshDM

Odpowiedz

1

To zostało uznane za błąd w JavaFX i zostanie rozwiązany w 2.2.6, zobacz here. Przetestowałem to z wczesną wersją dostępu i mogę potwierdzić, że zostało rozwiązane.

Powiązane problemy