I am trying out JFX Drag and Drop feature in my application (later connecting the objects in a sequence). I could not find any easy way to drag and drop my ImageView/Button at suitable position in my pane, hence I am planning to apply use of GridPane. The GridPane would be a large canvas with more than (50x50) cells.
If I specify in my code that I need to drag and drop by ImageView at, let's say, (2,2) cell, I am able to do it. But, I need to give that access to my user. User could move the pointer in grid and would drop the ImageView/Button at any cell in the grid.
Now, I would like to find out rowID and columnID of the cell on mouse entered in a particular cell of the GridPane.
I am handling mouse event in my Controller as follows:
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable{
Stage stage;
@FXML
private GridPane gridPane;
public void setStage(Stage primaryStage){
stage = primaryStage;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println("initialize");
}
@FXML
private void handleMouseEntered(MouseEvent event){
System.out.println("MouseEntered");
}
}
When enters in the gridpane, I get "MouseEntered" only once. Besides, I am not able to get any RowID and ColumnID, hence, I have not written any function in the function.
My interface looks like following:
I would like to know two things:
[] How to detect mouse entry in each cell of the gridpane?
[] How to find out row and column IDs of the particular cell?
Thanks in advance.
You can get the values by calling
GridPane.getColumnIndex(node)
andGridPane.getRowIndex(node)
.You haven't shown what you're putting in the grid pane, and even whether you are populating it in FXML or in Java, but here's some basic functionality. Here I (tediously) populate the
GridPane
in FXML, it might be better to populate it in Java (i.e. in the controller), depending on your use case. (That way, the handler gets a bit cleaner too.)Controller class:
If you don't want to define the contents of the cells in FXML, then you can just define them in the controller. That makes things cleaner, as you can just register the listener when you define them:
FXML:
Application: