2012-12-31 6 views
6

बहुत अजीब समस्या, मैं अंत में इसे कोड के एक छोटे टुकड़े में डिस्टिल करने में कामयाब रहा जो समस्या का प्रदर्शन करता है। मेरे पास एक फलक है, जिसमें 1 समूह है, समूहों में एक समूह होता है जिसमें कुछ अंडाकार होते हैं। शीर्ष समूह में एक घूर्णन परिवर्तन लागू होता है। अंडाकारों को खींचने योग्य बना दिया जाता है।नोड्स को खींचते समय उनके माता-पिता के पास नोड्स में परिवर्तन परिणाम होते हैं

नीचे दिए गए उदाहरण को आज़माएं, कुछ अंडाकार नीचे (समूह की सीमाओं के बाहर) खींचें, आप उन्हें गायब कर देखेंगे। यदि आप विंडो को अधिकतम करते हैं, तो वे फिर से दिखाई देते हैं लेकिन आप उन्हें अब खींच नहीं सकते हैं, उन्हें अब कोई घटना नहीं मिलती है।

अब वास्तव में अजीब भाग के लिए तीन तरीके मैं इस समस्या को दूर कर सकते हैं: (!?)

  1. बदलने
  2. एक अंडाकार हटाने लागू नहीं है (मैं पाने के लिए प्रयोग किया इस नंबर पर, 11)
  3. शुरू SCENICVIEW और के साथ-साथ अनेक बिंदुओं समूह चुनें, जिसमें ताकि आप समूह की सीमा से देख सकते हैं

मैं यहां कुल नुकसान पर हूं, पूरी तरह से बेवकूफी है। कृपया, क्या किसी को कोई विचार है कि यह समस्या क्यों हो रही है और इसे कैसे हल किया जाए?

संहिता (JavaFX 2.2.3 और जावा 1.7.0_09 64 बिट विंडोज 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

अगर इसे एक बग के रूप में स्वीकार किया गया है, तो क्या आप अभी भी एक काम की तलाश में हैं? अन्यथा, आप अपने प्रश्न का उत्तर दे सकते हैं और इसे बंद कर सकते हैं। – JoshDM

+0

मैंने इसे बंद करने का प्रयास किया, लेकिन प्रस्तावित कारणों में एक अच्छा मिलान कारण नहीं मिला। साथ ही, मुझे यकीन नहीं है कि खुले बक्षीस के साथ क्या होगा, इसलिए मैं इसकी प्रतीक्षा कर रहा था। –

+0

बग पावती का हवाला देते हुए, प्रश्न के अपने स्वयं के उत्तर पोस्ट करें। फिर स्वीकार किए गए अपने उत्तर को चिह्नित करें। आपको प्रतिपूर्ति मिलती है। – JoshDM

उत्तर

1

यह JavaFX में एक बग के रूप में स्वीकार किया गया है और 2.2.6 में हल किया जाएगा, here देखते हैं। मैंने इसे प्रारंभिक पहुंच रिलीज के साथ परीक्षण किया है और मैं पुष्टि कर सकता हूं कि इसे हल किया गया है।

संबंधित मुद्दे