2012-12-31 12 views
6
problema

molto strano, sono finalmente riuscito a distillare in un piccolo pezzo di codice che viene illustrato il problema. Ho un pannello, che contiene 1 gruppo, che i gruppi contiene un gruppo che contiene alcune ellissi. Il gruppo in alto ha applicato una trasformazione ruotata. Le ellissi sono rese trascinabili.trascinando i nodi quando il loro genitore ha una trasformazione risultati in nodi che scompaiono

Prova l'esempio di seguito, trascina alcuni puntini di sospensione verso il basso (al di fuori dei limiti del gruppo), li vedrai scomparire. Se ingrandisci la finestra, appaiono di nuovo ma non puoi più trascinarli, non ricevono più eventi.

Ora per la parte davvero strano, ci sono tre modi in cui posso rendere il problema andare via: (!?)

  1. non applicano la trasformazione
  2. rimuovere un'ellisse (ho sperimentato per ottenere a questo numero, 11)
  3. inizio ScenicView fianco e selezionare il gruppo che contiene i puntini di sospensione in modo da poter vedere i limiti del gruppo

Sono completamente perso qui, completamente stupefatto. Per favore, qualcuno ha qualche idea del perché questo problema si sta verificando e come risolverlo?

Codice (JavaFX e Java 2.2.3 1.7.0_09 64 bit di 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

Se è stato riconosciuto come un bug, stai ancora cercando un work-around? Altrimenti, puoi rispondere alla tua domanda e chiuderla. – JoshDM

+0

Ho provato a chiuderlo, ma non sono riuscito a trovare un buon motivo di abbinamento tra i motivi offerti da SO. Inoltre, non sono sicuro di cosa succederebbe alla taglia aperta, quindi stavo aspettando che scada prima. –

+0

Invia la tua risposta alla domanda, citando il riconoscimento del bug. Quindi spuntare la risposta come accettata. Hai un rimborso. – JoshDM

risposta

1

E 'stato riconosciuto come un bug in JavaFX e verrà risolto in 2.2.6, vedere here. L'ho provato con la prima versione di accesso e posso confermare che è stato risolto.

Problemi correlati