2015-05-08 8 views
6

समस्याबटन दबाए जाने पर नोड पर माउस आंदोलन का पता लगाने के लिए कैसे?

आप एक नोड जो उस पर माउस आंदोलन का पता लगाता है करने के लिए एक घटना श्रोता जोड़ सकते हैं। यदि नोड पर स्थानांतरित होने से पहले माउस बटन दबाया गया तो यह काम नहीं करता है।

प्रश्न

किसी को भी कैसे माउस आंदोलन का पता लगाने के, जबकि बटन दबाने पता है? अब तक मुझे केवल MOUSE_DRAGGED ईवेंट का उपयोग करके और फिर getPourceResult() का उपयोग करके getSource() का उपयोग करने और PickResult डेटा का मूल्यांकन करके समाधान मिला है।

यहां उल्लू के समाधान सहित कोड है। पुराने और नए समाधान useNewVersion (Uluk के संस्करण) बूलियन के माध्यम से switchable हैं:

enter image description here:

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.input.PickResult; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

    boolean useNewVersion= true; 

    int rows = 10; 
    int columns = 20; 
    double width = 1024; 
    double height = 768; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 

      // create grid 
      Grid grid = new Grid(columns, rows, width, height); 

      MouseGestures mg = new MouseGestures(); 

      // fill grid 
      for (int row = 0; row < rows; row++) { 
       for (int column = 0; column < columns; column++) { 

        Cell cell = new Cell(column, row); 

        mg.makePaintable(cell); 

        grid.add(cell, column, row); 
       } 
      } 

      root.setCenter(grid); 

      // create scene and stage 
      Scene scene = new Scene(root, width, height); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 



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

    public static void main(String[] args) { 
     launch(args); 
    } 

    private class Grid extends Pane { 

     int rows; 
     int columns; 

     double width; 
     double height; 

     Cell[][] cells; 

     public Grid(int columns, int rows, double width, double height) { 

      this.columns = columns; 
      this.rows = rows; 
      this.width = width; 
      this.height = height; 

      cells = new Cell[rows][columns]; 

     } 

     /** 
     * Add cell to array and to the UI. 
     */ 
     public void add(Cell cell, int column, int row) { 

      cells[row][column] = cell; 

      double w = width/columns; 
      double h = height/rows; 
      double x = w * column; 
      double y = h * row; 

      cell.setLayoutX(x); 
      cell.setLayoutY(y); 
      cell.setPrefWidth(w); 
      cell.setPrefHeight(h); 

      getChildren().add(cell); 

     } 

    } 

    private class Cell extends StackPane { 

     int column; 
     int row; 

     public Cell(int column, int row) { 

      this.column = column; 
      this.row = row; 

      getStyleClass().add("cell"); 

      Label label = new Label(this.toString()); 

      getChildren().add(label); 
     } 

     public void highlight() { 
      getStyleClass().add("cell-highlight"); 
     } 

     public void unhighlight() { 
      getStyleClass().remove("cell-highlight"); 
     } 

     public String toString() { 
      return this.column + "/" + this.row; 
     } 
    } 

    public class MouseGestures { 

     public void makePaintable(Node node) { 

      if(useNewVersion) { 

       node.setOnMousePressed(onMousePressedEventHandler); 
       node.setOnDragDetected(onDragDetectedEventHandler); 
       node.setOnMouseDragEntered(onMouseDragEnteredEventHandler); 

      } else { 

       node.setOnMousePressed(onMousePressedEventHandler); 
       node.setOnMouseDragged(onMouseDraggedEventHandler); 
       node.setOnMouseReleased(onMouseReleasedEventHandler); 

      } 

     } 

     /* old version */ 

     EventHandler<MouseEvent> onMousePressedEventHandler = event -> { 

      Cell cell = (Cell) event.getSource(); 

      if(event.isPrimaryButtonDown()) { 
       cell.highlight(); 
      } else if(event.isSecondaryButtonDown()) { 
       cell.unhighlight(); 
      } 
     }; 

     EventHandler<MouseEvent> onMouseDraggedEventHandler = event -> { 

      PickResult pickResult = event.getPickResult(); 
      Node node = pickResult.getIntersectedNode(); 

      if(node instanceof Cell) { 

       Cell cell = (Cell) node; 

       if(event.isPrimaryButtonDown()) { 
        cell.highlight(); 
       } else if(event.isSecondaryButtonDown()) { 
        cell.unhighlight(); 
       }  

      } 

     }; 

     EventHandler<MouseEvent> onMouseReleasedEventHandler = event -> { 
     }; 

     EventHandler<MouseEvent> onDragDetectedEventHandler = event -> { 

      Cell cell = (Cell) event.getSource(); 
      cell.startFullDrag(); 

     }; 

     EventHandler<MouseEvent> onMouseDragEnteredEventHandler = event -> { 

      Cell cell = (Cell) event.getSource(); 

      if(event.isPrimaryButtonDown()) { 
       cell.highlight(); 
      } else if(event.isSecondaryButtonDown()) { 
       cell.unhighlight(); 
      }  

     }; 

    } 

} 

अंत में आप माध्यमिक माउस बटन के माध्यम से प्राथमिक माउस बटन के माध्यम से रंग और रंग को मिटाने के लिए सक्षम होना चाहिए

+1

'' node' Button' से अलग है? मुझे आपका प्रश्न बिल्कुल नहीं मिला है। क्या आप दबाए जाने पर उसी बटन पर माउस आंदोलन पढ़ने की कोशिश कर रहे हैं? – ItachiUchiha

+3

नोड जो प्रारंभिक DRAG_DETECTED घटना संभालती sourceNode.startFullDrag() आह्वान करना चाहिए, उसके बाद लक्ष्य नोड में सक्षम targetNode.setOnMouseDragOver() विधि के साथ MOUSE_DRAG_OVER घटनाओं प्रबंधन किया जाएगा। –

+1

@IachachiUchia: मेरा मतलब माउस बटन था। मैंने इसे बदल दिया और उलुक के संस्करण सहित कोड जोड़ा। मुझे कल ए * एल्गोरिदम के लिए इसकी आवश्यकता थी, ताकि सरल माउस ड्रैग के माध्यम से विभिन्न प्रकार की दीवारों को पेंट करना आसान हो (प्राथमिक बटन नीचे होने पर)। यह काम किया, लेकिन PickResult का उपयोग अजीब लगा। – Roland

उत्तर

2

(स्रोत) नोड जो प्रारंभिक DRAG_DETECTED घटना संभालती sourceNode.startFullDrag() आह्वान करना चाहिए, उसके बाद लक्ष्य नोड या उदाहरण MOUSE_DRAG_OVER के लिए MouseDragEvent रों में से एक, संबंधित 012 के साथ MOUSE_DRAG_ENTERED घटना को संभालने में सक्षम होगाविधि।

6

एक समाधान दृश्य जिसमें sourceNode.startFullDrag सक्षम बनाता है के लिए एक घटना फ़िल्टर जोड़ने के लिए है()। यह तब भी काम करेगा जब आप अपने कैनवास के बाहर माउस खींचना शुरू करते हैं (यदि आप अपने आवेदन में नोड्स के बिना कोई स्थान चाहते हैं)।

इस तरह

:

scene.addEventFilter(MouseEvent.DRAG_DETECTED , new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent mouseEvent) { 
     scene.startFullDrag(); 
    } 
}); 

और फिर आप:

node.setOnMouseDragEntered(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     led.setOn(true); 
    } 
}); 
संबंधित मुद्दे