2012-11-29 10 views
7

में ड्रैग-एंड-ड्रॉप लागू करें मैं जावाएफएक्स 2.2 में एक एप्लीकेशन बना रहा हूं जिसमें बाईं ओर घटक के पैनल के साथ एक स्प्लिटपेन और दाईं ओर एक कार्यपत्रक शामिल है। असल में मैं जो करना चाहता हूं वह एक साधारण wysiwyg संपादक है जहां आप बाएं से दाएं घटक खींचते हैं, फिर उन्हें दाईं ओर व्यवस्थित करें।दृश्य बिल्डर

..

मैं दिन में एक ही ड्रैग और ड्रॉप विशेषता यह है कि SceneBuilder है को लागू करने की कोशिश कर पिछले कुछ खर्च किया है भाग्य के बिना,

http://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.html पर नमूना के बाद मैं एक drag- पाने के लिए प्रबंधित किया है और काम छोड़ना, लेकिन जब आप खींच रहे हैं तो दिखाई देने वाले डिफ़ॉल्ट फ़ाइल आइकन को बदलने के लिए मुझे कोई रास्ता नहीं मिल रहा है (और उस घटक के स्नैपशॉट के साथ इसे प्रतिस्थापित करें जिसे मैं खींच रहा हूं) और जब आप किसी चीज़ पर वर्जित आइकन दिखाएंगे आप पर नहीं छोड़ा जा सकता है।

किसी भी मदद (सलाह, कोड स्निपेट, नमूना या फिर हो सकता है) बहुत सराहना की जाएगी :)

धन्यवाद!

उत्तर

16

[अद्यतन]

अंत में इसे अपने आप को कामयाब:

/* The 'sceneRoot' object is the root Node of the scene graph 
* stage.setScene(new Scene(sceneRoot, 1280, 1024)); 
*/ 

private ImageView dragImageView = new ImageView(); 
private Node dragItem; 

_

rightPane.setOnMouseDragEntered(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-color:red;-fx-border-width:2;-fx-border-style:solid;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragExited(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-style:none;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     //TODO: add new instance of dragItem to rightPane 
     e.consume(); 
    } 
}); 

_

private void addGesture(final Node node) { 
    node.setOnDragDetected(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 

      SnapshotParameters snapParams = new SnapshotParameters(); 
      snapParams.setFill(Color.TRANSPARENT); 
      dragImageView.setImage(node.snapshot(snapParams, null)); 

      sceneRoot.getChildren().add(dragImageView); 

      dragImageView.startFullDrag(); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      Point2D localPoint = sceneRoot.sceneToLocal(new Point2D(e.getSceneX(), e.getSceneY())); 
      dragImageView.relocate(
        (int)(localPoint.getX() - dragImageView.getBoundsInLocal().getWidth()/2), 
        (int)(localPoint.getY() - dragImageView.getBoundsInLocal().getHeight()/2) 
      ); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      node.setCursor(Cursor.HAND); 
     } 
    }); 
    node.setOnMousePressed(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = node; 
      dragImageView.setMouseTransparent(true); 
      node.setMouseTransparent(true); 
      node.setCursor(Cursor.CLOSED_HAND); 
     } 
    }); 
    node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = null; 
      dragImageView.setMouseTransparent(false); 
      node.setMouseTransparent(false); 
      node.setCursor(Cursor.DEFAULT); 
      sceneRoot.getChildren().remove(dragImageView); 
     } 
    }); 

} 
+1

अच्छा काम। [ड्रैग व्यू फीचर] (http://javafx-jira.kenai.com/browse/RT-14730?focusedCommentId=317064#) भविष्य में रिलीज में जावाएफएक्स प्लेटफॉर्म में जोड़ा जा सकता है, संभवतः jdk8। – jewelsea

+0

मैं सूची दृश्य के लिए समाधान को पुन: कार्यान्वित करने का प्रयास करता हूं, लेकिन यह नहीं पता कि setOnDragDetected हैंडलर में दृश्य चर किस प्रकार का है। यह कोई दृश्य नहीं है, क्योंकि दृश्य को बच्चा नहीं मिला है() विधि। – andreas

+0

'दृश्य' ऑब्जेक्ट वास्तव में दृश्य ग्राफ का रूट नोड है। मैंने बेहतर कोड के लिए दृश्य कोड द्वारा टिप्पणियों के साथ अपना कोड अपडेट किया है और दृश्य नाम बदल दिया है। उस पर प्रकाश डालने के लिए धन्यवाद;) – Badisi

2

हो सकता है कि देर से, लेकिन setDragView विकल्प के साथ, अब तक अधिक सरल है :)

// Cursor Display for Drag&Drop 
source.setOnMouseEntered(e -> source.setCursor(Cursor.OPEN_HAND)); 
source.setOnMousePressed(e -> source.setCursor(Cursor.CLOSED_HAND)); 
source.setOnMouseReleased(e -> source.setCursor(Cursor.DEFAULT)); 

// Manage drag 
source.setOnDragDetected(event -> { 
    /* drag was detected, start a drag-and-drop gesture*/ 
    Dragboard db = source.startDragAndDrop(TransferMode.MOVE); 

    // Visual during drag 
    SnapshotParameters snapshotParameters = new SnapshotParameters(); 
    snapshotParameters.setFill(Color.TRANSPARENT); 
    db.setDragView(source.snapshot(snapshotParameters, null)); 

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

    event.consume(); 
}); 
संबंधित मुद्दे