我目前正在开发一款游戏,该游戏的运行方式与此处已经问到的一款游戏类似:JavaFX Drag and drop to GridPane?。
我有一个拆分窗格,左边有一个Gridpane,右边有一些Images(Imageview)。 我想将图像拖到网格窗格中的字段。
我是JavaFX的新手,尤其是Gridpane和拖放。这就是为什么我要处理很多已经问到的问题的代码的原因。
我试图将这些示例中的代码改编成我的Controller类,但是它不起作用。
编辑:
网格中的字段是否是一个对象,这意味着我可以说诸如event.getTarget = Image之类的东西吗?还是我必须在可以处理的字段中设置对象/节点?
编辑:
控制器类:
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.GridPane;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
public class FXMLSTPreFieldController {
@FXML
private ImageView bomb;
public GridPane Board;
final GridPane target = Board;
// Event Listener on ImageView[#bomb].onDragDetected
@FXML
public void Drag(MouseEvent event) {
Dragboard db = bomb.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putImage(bomb.getImage());
db.setContent(content);
event.consume();
}
@FXML
public void Over(DragEvent event) {
if(event.getGestureSource() != target && event.getDragboard().hasImage()){
// moving
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
}
@FXML
public void Drop(DragEvent event) {
//Data drop
Dragboard db = event.getDragboard();
boolean success = false;
Node node = event.getPickResult().getIntersectedNode();
if(node != target && db.hasImage()){
Integer cIndex = GridPane.getcolumnIndex(node);
Integer rIndex = GridPane.getRowIndex(node);
int x = cIndex == null ? 0 : cIndex;
int y = rIndex == null ? 0 : rIndex;
target.add(bomb,x,y);
ImageView bomb = new ImageView(db.getImage());
Board.add(bomb,y,1,1);
success = true;
}
event.setDropCompleted(success);
event.consume();
}
@FXML
public void Exit(DragEvent event) {
// //mouse moved away,remove graphical cues
// bomb.setVisible(true);
// target.setOpacity(1);
//
// event.consume();
}
@FXML
public void handle(DragEvent event) {
//The drag-and-drop gesture entered the target
//show the user that it is an actual gesture target
if(event.getGestureSource() != target && event.getDragboard().hasImage()){
bomb.setVisible(false);
target.setOpacity(0.7);
System.out.println("Drag entered");
}
event.consume();
}
@FXML
public void Done(DragEvent event) {
//the drag and drop gesture has ended
//if the data was successfully moved,clear it
if(event.getTransferMode() == TransferMode.MOVE){
bomb.setVisible(false);
}
event.consume();
}
}