2012-04-15 104 views
1

我想連接2個形狀與線,而鼠標按下。 由於文檔說我不能使用按下拖動釋放模型來做到這一點,所以應該使用拖放方法 - 一切看起來都不錯,但是如何禁用默認圖標,該圖標表示允許拖放內容放置目標?在mouseMove上畫線,我不想要這些默認圖標。javafx拖放默認圖標

我包括簡單的程序顯示它 - 只要運行我嘗試拖一圈到其他。

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package onreleased; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.*; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 

/** 
* 
* @author mmk 
*/ 
public class DaDIcons extends Application { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Hello World!"); 


     final Label label = new Label("started"); 
     label.setLayoutY(100); 

     Pane pane = new Pane(); 
     Circle red = createCircle(40, 40, 30, Color.RED, label); 
     Circle blue = createCircle(160, 40, 30, Color.BLUE, label); 

     pane.setOnDragOver(new EventHandler<DragEvent>() { 

      @Override 
      public void handle(DragEvent event) { 

       System.out.println("foo"); 

      } 
     }); 

     pane.getChildren().addAll(red, blue, label); 

     primaryStage.setScene(new Scene(pane, 300, 250)); 
     primaryStage.show(); 
    } 

    private Circle createCircle(double x, double y, double r, final Color color, final Label statusLabel) { 

     final Circle circle = new Circle(x, y, r); 
     circle.setFill(color); 

     circle.setOnDragOver(new EventHandler<DragEvent>() { 

      @Override 
      public void handle(DragEvent event) { 
       statusLabel.setText(color.toString() + " over"); 
       System.out.println("foo"); 
       if (event.getGestureSource() != circle) { 


        event.acceptTransferModes(TransferMode.ANY); 
       } 
      } 
     }); 

     circle.setOnDragDropped(new EventHandler<DragEvent>() { 

      @Override 
      public void handle(DragEvent arg0) { 
       statusLabel.setText(color.toString() + " dropped"); 
      } 
     }); 

     circle.setOnDragDetected(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent arg0) { 
       circle.startDragAndDrop(TransferMode.ANY); 
       Dragboard db = circle.startDragAndDrop(TransferMode.ANY); 

       /* 
       * Put a string on a dragboard 
       */ 
       ClipboardContent content = new ClipboardContent(); 
       content.putString("foo"); 
       db.setContent(content); 


       statusLabel.setText(color.toString() + " xxxxxxxxxxxxxxxxxxxxxxx"); 
      } 
     }); 

     circle.setOnDragEntered(null); 

     return circle; 

    } 
} 

回答

0

您可以使用drag-n-drop操作管理Cursor
circle.setOnDragDetected()動作集circle.setCursor(Cursor.NONE);
circle.setOnDragDropped()動作反轉它circle.setCursor(Cursor.DEFAULT);
除了顯示光標圖標之外,您還可以在鼠標座標下顯示圖像,同時顯示d-n-drop。

+0

對不起,但它不起作用。 – 2012-04-16 13:49:19

+0

那它怎麼沒用?它拋出異常嗎?禁用光標不符合您的需求?答案需要更多解釋? – 2012-04-16 14:30:37

+0

每個拖動事件都沒有設置Cursor.NONE的效果 - 它仍然是默認值。我發現與此同時http://javafx-jira.kenai.com/browse/RT-20326所以propably我使用onMousePressed在父節點,我會檢查子節點被按下/釋放;/ – 2012-04-16 14:52:46