समस्याबटन दबाए जाने पर नोड पर माउस आंदोलन का पता लगाने के लिए कैसे?
आप एक नोड जो उस पर माउस आंदोलन का पता लगाता है करने के लिए एक घटना श्रोता जोड़ सकते हैं। यदि नोड पर स्थानांतरित होने से पहले माउस बटन दबाया गया तो यह काम नहीं करता है।
प्रश्न
किसी को भी कैसे माउस आंदोलन का पता लगाने के, जबकि बटन दबाने पता है? अब तक मुझे केवल MOUSE_DRAGGED ईवेंट का उपयोग करके और फिर getPourceResult() का उपयोग करके getSource() का उपयोग करने और PickResult डेटा का मूल्यांकन करके समाधान मिला है।
यहां उल्लू के समाधान सहित कोड है। पुराने और नए समाधान useNewVersion (Uluk के संस्करण) बूलियन के माध्यम से switchable हैं:
:
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();
}
};
}
}
अंत में आप माध्यमिक माउस बटन के माध्यम से प्राथमिक माउस बटन के माध्यम से रंग और रंग को मिटाने के लिए सक्षम होना चाहिए
'' node' Button' से अलग है? मुझे आपका प्रश्न बिल्कुल नहीं मिला है। क्या आप दबाए जाने पर उसी बटन पर माउस आंदोलन पढ़ने की कोशिश कर रहे हैं? – ItachiUchiha
नोड जो प्रारंभिक DRAG_DETECTED घटना संभालती sourceNode.startFullDrag() आह्वान करना चाहिए, उसके बाद लक्ष्य नोड में सक्षम targetNode.setOnMouseDragOver() विधि के साथ MOUSE_DRAG_OVER घटनाओं प्रबंधन किया जाएगा। –
@IachachiUchia: मेरा मतलब माउस बटन था। मैंने इसे बदल दिया और उलुक के संस्करण सहित कोड जोड़ा। मुझे कल ए * एल्गोरिदम के लिए इसकी आवश्यकता थी, ताकि सरल माउस ड्रैग के माध्यम से विभिन्न प्रकार की दीवारों को पेंट करना आसान हो (प्राथमिक बटन नीचे होने पर)। यह काम किया, लेकिन PickResult का उपयोग अजीब लगा। – Roland