2012-12-31 14 views
6

Vấn đề rất lạ, cuối cùng tôi đã cố gắng chưng cất nó thành một đoạn mã nhỏ thể hiện vấn đề. Tôi có một cửa sổ, trong đó có 1 nhóm, các nhóm đó chứa một nhóm có chứa một số hình elip. Nhóm trên cùng có một biến đổi xoay được áp dụng cho nó. Các hình elip được tạo ra có thể kéo được.kéo các nút khi cha mẹ của chúng có kết quả chuyển đổi trong các nút biến mất

Hãy thử ví dụ dưới đây, kéo một số hình elip xuống dưới (bên ngoài giới hạn của nhóm), bạn sẽ thấy chúng biến mất. Nếu bạn phóng to cửa sổ, chúng sẽ xuất hiện trở lại nhưng bạn không thể kéo chúng nữa, chúng sẽ không nhận được bất kỳ sự kiện nào nữa.

Đây là phần thực sự kỳ lạ, có ba cách tôi có thể làm cho vấn đề đi xa: (!?)

  1. không áp dụng biến đổi
  2. loại bỏ một hình elip (Tôi đã thử nghiệm để có được đến con số này, 11)
  3. bắt đầu ScenicView cùng chọn nhóm chứa elip, do đó bạn có thể thấy giới hạn của nhóm

Tôi đang thua lỗ ở đây, hoàn toàn bất ổn. Xin vui lòng, không ai có bất kỳ ý tưởng tại sao vấn đề này xảy ra và làm thế nào để giải quyết nó?

Mã (JavaFX 2.2.3 và 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

Nếu nó được xác nhận là lỗi, bạn vẫn đang tìm kiếm một công việc xung quanh? Nếu không, bạn có thể trả lời câu hỏi của riêng mình và đóng câu hỏi này. – JoshDM

+0

Tôi đã cố gắng đóng nó, nhưng không thể tìm thấy một lý do phù hợp tốt trong những lý do SO cung cấp. Ngoài ra, tôi không chắc chắn những gì sẽ xảy ra với tiền thưởng mở, vì vậy tôi đã chờ đợi nó hết hạn đầu tiên. –

+0

Đăng câu trả lời của riêng bạn cho câu hỏi, trích dẫn xác nhận lỗi. Sau đó kiểm tra đánh dấu câu trả lời của bạn là được chấp nhận. Bạn được hoàn tiền. – JoshDM

Trả lời

1

Nó được công nhận là một lỗi trong JavaFX và sẽ được giải quyết trong 2.2.6, xem here. Tôi đã thử nghiệm nó với bản phát hành truy cập sớm và tôi có thể xác nhận nó đã được giải quyết.

Các vấn đề liên quan