2015-10-09 200 views
0

在JavaFX中,我試圖通過單擊並拖動它來移動節點。如果節點沒有旋轉,它會工作得很好,但是當我旋轉它時,它會開始表現怪異。JavaFX拖動旋轉節點

在45°左右,當我移動它時開始抖動,在60°時它猛烈地來回跳動。當我開始移動它時,節點在90°處飛行。

這裏是我用來旋轉和移動節點的代碼。它來自連接到節點的MouseListener。

if(event.getEventType() == MouseEvent.MOUSE_RELEASED) { 
    (this.lastEvent == MouseEvent.MOUSE_PRESSED) { 
     if(getRotate() == 0) { 
      setRotate(90d); 
     } else { 
      setRotate(0d); 
     } 
    } 
} 
if(event.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
    if(getRotate() == 0) { 
     setTranslateX(getTranslateX() + event.getX()); 
     setTranslateY(getTranslateY() + event.getY()); 
     System.out.print(" trX: " + getTranslateX()); 
     System.out.print(" evX: " + event.getX()); 
     System.out.println(" evY: " + event.getY()); 
    } else { 
     setTranslateX(getTranslateX() + event.getX()); 
     setTranslateY(getTranslateY() + event.getY()); 
     System.out.print(" trX: " + getTranslateX()); 
     System.out.print(" evX: " + event.getX()); 
     System.out.println(" evY: " + event.getY()); 
    } 
} 

編輯:下面是一些示例輸出,以及畫面顯示不同的節點。

輸出時不旋轉,慢慢移動到左邊:

trX: 333.0 evX: -1.0 evY: 0.0 
trX: 333.0 evX: 0.0 evY: -1.0 
trX: 332.0 evX: -1.0 evY: 0.0 
trX: 332.0 evX: 0.0 evY: -1.0 
trX: 331.0 evX: -1.0 evY: 0.0 
trX: 330.0 evX: -1.0 evY: -1.0 
trX: 330.0 evX: 0.0 evY: 1.0 

輸出時,慢慢移動到左邊,而旋轉:

trX: 102.0 evX: 142.0 evY: -245.0 
trX: 489.0 evX: 387.0 evY: -102.0 
trX: 978.0 evX: 489.0 evY: 286.0 
trX: 1181.0 evX: 203.0 evY: 776.0 
trX: 607.0 evX: -574.0 evY: 979.0 
trX: -947.0 evX: -1554.0 evY: 405.0 
trX: -2905.0 evX: -1958.0 evY: -1149.0 
trX: -3714.0 evX: -809.0 evY: -3106.0 
trX: -1417.0 evX: 2297.0 evY: -3914.0 
trX: 4795.0 evX: 6212.0 evY: -1617.0 
trX: 12623.0 evX: 7828.0 evY: 4595.0 
trX: 15857.0 evX: 3234.0 evY: 12423.0 
trX: 6668.0 evX: -9189.0 evY: 15658.0 
trX: -18180.0 evX: -24848.0 evY: 6469.0 
trX: -49497.0 evX: -31317.0 evY: -18378.0 
trX: -62436.0 evX: -12939.0 evY: -49694.0 
trX: -25681.0 evX: 36755.0 evY: -62632.0 
trX: 73706.0 evX: 99387.0 evY: -25876.0 
trX: 198969.0 evX: 125263.0 evY: 73512.0 
trX: 250720.0 evX: 51751.0 evY: 198776.0 
trX: 103694.0 evX: -147026.0 evY: 250526.0 
trX: -293858.0 evX: -397552.0 evY: 103501.0 
trX: -794910.0 evX: -501052.0 evY: -294051.0 
trX: -1001912.0 evX: -207002.0 evY: -795103.0 
trX: -413811.0 evX: 588101.0 evY: -1002104.0 

這裏是程序的AA圖片:
Picture of program

外框是'父'節點,而內部黑框帶有文字「不」一個侏儒「是我試圖移動的節點。 將鼠標事件偵聽器添加到內部節點。

+0

你從輸出中得到了什麼?我想這可能與double到int的四捨五入有關。這個代碼定義在哪個節點上? – hotzst

回答

1

我終於想出了一個解決方案。

除了基於鼠標位置的位置移動節點之外,我現在計算它與場景座標的變化程度。

這裏是更新的代碼,關於上下文的所有內容都與問題中的相同。

if(event.getEventType() == MouseEvent.MOUSE_PRESSED) { 
    this.mouseInSceneX = event.getSceneX(); 
    this.mouseInSceneY = event.getSceneY(); 

    Card.this.setCursor(Cursor.MOVE); 
} 
if(event.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
    double xChange = event.getSceneX() - mouseInSceneX; 
    double yChange = event.getSceneY() - mouseInSceneY; 

    setTranslateX(getTranslateX() + xChange); 
    setTranslateY(getTranslateY() + yChange); 

    mouseInSceneX = event.getSceneX(); 
    mouseInSceneY = event.getSceneY(); 

    System.out.print(" trX: " + Card.this.getTranslateX()); 
    System.out.print(" trY: " + Card.this.getTranslateY()); 
    System.out.print(" cgpX: " + mouseInSceneX); 
    System.out.print(" cgpY: " + mouseInSceneY); 
    System.out.println(); 
} 
+0

在旋轉節點上穩定拖動的非常好的解決方案。使用sceneX而不是getX修復它。 – Daniel