2012-12-31 20 views
6

Çok garip bir problem, sonunda sorunu gösteren küçük bir kod parçasına dönüştürmeyi başardım. 1 grup içeren bir bölmem var, bu gruplar bazı elips içeren bir grup içeriyor. Üst grupta uygulanan döndürme dönüşümü vardır. Elipsler sürüklenebilir.ebeveynleri dönüşümü olduğunda düğümlerin kaybolmasıyla sonuçlanan düğümlerin sürüklenmesi

Aşağıdaki örneği deneyin, bazı elipsleri aşağıya doğru sürükleyin (grubun sınırları dışında), kaybolduğunu görürsünüz. Pencereyi en üst düzeye çıkarırsanız tekrar görünürler ancak artık onları sürükleyemezsiniz, artık herhangi bir etkinlik almazlar. Gerçekten garip kısmı için Şimdi

, üç yolu Sorunun kurtulabiliriz vardır: (!?)

  1. bir elips kaldırmak dönüşümü geçerli değildir (benim hemen denedi gruptaki sınırlarını görebilmek için bu numaraya, ve yanında 11)
  2. başlangıç ​​SCENICVIEW elips içeren grubu seçin

Burada tam bir kayıp yaşıyorum, tamamen aptalca. Lütfen, bu sorunun neden oluştuğunu ve nasıl çözüleceğine dair bir fikri olan var mı?

Kodu (JavaFX 2.2.3 ve java 1.7.0_09 64bit Windows 7): Bu JavaFX bir hata olarak kabul oldu ve 2.2.6 çözülecektir

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

Hata olarak kabul edildiyse, hala etrafı gezmeye mi çalışıyorsunuz? Aksi takdirde, kendi sorunuzu cevaplayabilir ve kapatabilirsiniz. – JoshDM

+0

Kapatma işlemini denedim, ancak SO'nın sunduğu nedenlerle iyi bir eşleşme bulamadı. Ayrıca, açık cömertliğe ne olacağından emin değilim, bu yüzden ilk önce sona ermek için bekliyordum. –

+0

Sorunun cevabını, hata onayını gerekçe göstererek gönderin. Sonra cevabınızı kabul edildi olarak işaretleyin. Bir geri ödeme alırsın. – JoshDM

cevap

1

, here bakın. Erken erişim sürümüyle test ettim ve çözüldüğünden emin olabilirim.

İlgili konular