2012-08-02 15 views
18

मैं स्क्रीन के चारों ओर एक असज्जित चरण स्थानांतरित करने के लिए, निम्न माउस श्रोताओं का उपयोग करके की कोशिश कर रहा है:JavaFX में एक असज्जित चरण बढ़ते 2

  • onPressed
  • onReleased
  • onDragged

इन घटनाओं एक आयत से कर रहे हैं। मेरा विचार असज्जित खिड़की आयत पर क्लिक करके और सभी खिड़की खींचकर ले जाने के लिए है।

 
@FXML 
protected void onRectanglePressed(MouseEvent event) { 
    X = primaryStage.getX() - event.getScreenX(); 
    Y = primaryStage.getY() - event.getScreenY(); 
} 

@FXML 
protected void onRectangleReleased(MouseEvent event) { 
    primaryStage.setX(event.getScreenX()); 
    primaryStage.setY(event.getScreenY()); 
} 

@FXML 
protected void onRectangleDragged(MouseEvent event) { 
    primaryStage.setX(event.getScreenX() + X); 
    primaryStage.setY(event.getScreenY() + Y); 
} 

मैं इन घटनाओं के साथ जो कुछ मिला है वह तब है जब मैं आयताकार दबाता हूं और खिड़की खींचना शुरू करता हूं, यह थोड़ा सा चलता है। लेकिन, जब मैं बटन छोड़ देता हूं, तो खिड़की को आयताकार में स्थानांतरित किया जाता है।

अग्रिम धन्यवाद।

+0

ईवेंट को संभालने की कोई आवश्यकता नहीं है ReectangleReleased। –

उत्तर

17

मैं एक असज्जित खिड़की जो आप के आसपास खींच सकते हैं में एक एनिमेटेड घड़ी की एक sample बनाया। नमूना से

प्रासंगिक कोड है:

// allow the clock background to be used to drag the clock around. 
final Delta dragDelta = new Delta(); 
layout.setOnMousePressed(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
    // record a delta distance for the drag and drop operation. 
    dragDelta.x = stage.getX() - mouseEvent.getScreenX(); 
    dragDelta.y = stage.getY() - mouseEvent.getScreenY(); 
    } 
}); 
layout.setOnMouseDragged(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
    stage.setX(mouseEvent.getScreenX() + dragDelta.x); 
    stage.setY(mouseEvent.getScreenY() + dragDelta.y); 
    } 
}); 

... 

// records relative x and y co-ordinates. 
class Delta { double x, y; } 

कोड बहुत मिलता-जुलता है, इसलिए काफी यकीन है कि क्यों अपने कोड आप के लिए काम नहीं कर रहा नहीं लग रहा है।

+0

हां, यह वही है।आखिर में समाधान मिला, मेरी गलती गलत घटना का उपयोग कर रही थी। मैं दृश्य निर्माता का उपयोग कर रहा था। लेकिन setOnMouseDragged को लागू करने, सब कुछ सही हो जाता है। धन्यवाद! –

+0

मैंने देखा है कि इस विधि में सिस्टम विंडो ड्रैग की तुलना में कम ताज़ा दर है। इच्छा है कि मैं सिस्टम विंडो स्थिति रिलायोकेटर का उपयोग कैसे करना जानता था। – Pathfinder

+0

अवांछित करने के लिए सेटिंग चरण त्वरित किनारे आकार बदलने के लिए विंडो 10 समर्थन हटाता है – Pathfinder

3

मेरा अनुमान है कि आपके है:

onRectangleReleased() 

अपने

onRectanglePressed() 

से बहुत ही निर्देशांक गुजर रहा है यह तब होता है क्योंकि दस्तावेज में कहा गया है MouseEvent वर्ग रिटर्न से getX() विधि

मूस की उत्पत्ति के सापेक्ष घटना की क्षैतिज स्थिति eEvent का स्रोत।

तब, जब आप अपना माउस छोड़ते हैं तो यह वास्तव में आपके आयत को उस स्थान पर रखता है जब आप पहली बार दबाए गए थे।

Btw, मैं एक StackPane एक आयत के साथ अंदर और उसके बाद का उपयोग निम्नलिखित कोड लागू करें:

private void addDragListeners(final Node n){ 
     n.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent me) { 
       if(me.getButton()!=MouseButton.MIDDLE) 
       { 
        initialX = me.getSceneX(); 
        initialY = me.getSceneY(); 
       } 
       else 
       { 
        n.getScene().getWindow().centerOnScreen(); 
        initialX = n.getScene().getWindow().getX(); 
        initialY = n.getScene().getWindow().getY(); 
       } 

      } 
     }); 

     n.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent me) { 
       if(me.getButton()!=MouseButton.MIDDLE) 
       { 
        n.getScene().getWindow().setX(me.getScreenX() - initialX); 
        n.getScene().getWindow().setY(me.getScreenY() - initialY); 
       } 
      } 
     }); 
} 

addDragListeners(mainStackPane); 

कि इसके अलावा, मैं मध्य माउस बटन का उपयोग स्क्रीन पर मेरी खिड़की केंद्रित करने के लिए। मुझे आशा थी कि इससे मदद मिलेगी। चीयर्स!

+0

धन्यवाद। मैं दृश्य निर्माता के साथ जीयूआई बना रहा था, और मैं गलत ड्रैग इवेंट का उपयोग कर रहा था। मैं mouseDragged और सभी कार्यों पर लागू। धन्यवाद! –

13

मैं किसी भी निहित नोड खींचकर undecoraqted चरणों खींच लिए इस समाधान का उपयोग कर रहा हूँ।

private void addDraggableNode(final Node node) { 

    node.setOnMousePressed(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent me) { 
      if (me.getButton() != MouseButton.MIDDLE) { 
       initialX = me.getSceneX(); 
       initialY = me.getSceneY(); 
      } 
     } 
    }); 

    node.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent me) { 
      if (me.getButton() != MouseButton.MIDDLE) { 
       node.getScene().getWindow().setX(me.getScreenX() - initialX); 
       node.getScene().getWindow().setY(me.getScreenY() - initialY); 
      } 
     } 
    }); 
} 
1
double x, y; 

private void addDragListeners(final Node n, Stage primaryStage){ 

    n.setOnMousePressed((MouseEvent mouseEvent) -> { 
     this.x = n.getScene().getWindow().getX() - mouseEvent.getScreenX(); 
     this.y = n.getScene().getWindow().getY() - mouseEvent.getScreenY(); 
    }); 

    n.setOnMouseDragged((MouseEvent mouseEvent) -> { 
     primaryStage.setX(mouseEvent.getScreenX() + this.x); 
     primaryStage.setY(mouseEvent.getScreenY() + this.y); 
    }); 
} 

public void start(Stage primaryStage) { 

    try { 

     ... 

     addDragListeners(mainPane, primaryStage); 

    } catch (Exception e) { 
     e.printStackTrace(System.out); 
    } 

} 
1

jewelsea के जवाब के आधार पर मैं MouseListeners मेरी शुरुआत() विधि में दृश्य पर सीधे स्थापित करने के लिए दो लांबा से अभिव्यक्त किया। ठीक काम करता है :)

private double xOffset; 
private double yOffset; 
     /* 
     The two following lambda expressions makes it possible to move the application without the standard StageStyle 
     */ 
     //Lambda mouse event handler 
     scene.setOnMousePressed(event -> { 
      xOffset = primaryStage.getX() - event.getScreenX(); 
      yOffset = primaryStage.getY() - event.getScreenY(); 
     }); 
     //Lambda mouse event handler 
     scene.setOnMouseDragged(event -> { 
      primaryStage.setX(event.getScreenX() + xOffset); 
      primaryStage.setY(event.getScreenY() + yOffset); 
     });enter code here