Java 如何在不显示正在拖动的图片的情况下拖放?
我正在设置一个战列舰游戏,通过将战列舰的Java 如何在不显示正在拖动的图片的情况下拖放?,java,javafx,drag-and-drop,fxml,Java,Javafx,Drag And Drop,Fxml,我正在设置一个战列舰游戏,通过将战列舰的ImageView拖到网格中的按钮上,我希望能够在游戏板上设置战列舰。我有以下代码来设置到目前为止的所有拖放操作: private void configureDragAndDrop(ImageView image) { image.setOnDragDetected(new EventHandler<MouseEvent>(){ @Override publi
ImageView
拖到网格中的按钮上,我希望能够在游戏板上设置战列舰。我有以下代码来设置到目前为止的所有拖放操作:
private void configureDragAndDrop(ImageView image) {
image.setOnDragDetected(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
Dragboard db = pictureOne.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putImage(pictureOne.getImage());
db.setContent(content);
event.consume();
}
});
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
/* data is dragged over the target */
/* accept it only if it is not dragged from the same node
* and if it has a string data */
if (event.getGestureSource() != target &&
event.getDragboard().hasImage()) {
/* allow for moving */
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
}
});
}
}
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragEntered(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
/* the drag-and-drop gesture entered the target */
/* show to the user that it is an actual gesture target */
if (event.getGestureSource() != target &&
event.getDragboard().hasImage()) {
target.setStyle("-fx-background-color: pink");
}
event.consume();
}
});
}
}
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragExited(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
/* mouse moved away, remove the graphical cues */
target.setStyle("-fx-background-color:blue");
event.consume();
}
});
}
}
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragDropped(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
/* data dropped */
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasImage()) {
target.setStyle("-fx-background-color:green");
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
}
});
}
}
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragDone(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
/* data dropped */
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasImage()) {
target.setStyle("-fx-background-color:yellow");
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
}
});
}
}
image.setOnDragDone(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
/* the drag and drop gesture ended */
/* if the data was successfully moved, clear it */
if (event.getTransferMode() == TransferMode.MOVE) {
pictureOne.setOpacity(0.0);
}
event.consume();
}
});
}
private void配置DragandDrop(图像视图图像){
检测到image.setOnDragDetected(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
Dragboard db=pictureOne.startDragAndDrop(TransferMode.ANY);
ClipboardContent=新的ClipboardContent();
content.putImage(pictureOne.getImage());
db.setContent(content);
event.consume();
}
});
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
/*将数据拖到目标上*/
/*仅当未从同一节点拖动它时才接受它
*如果它有一个字符串数据*/
如果(event.getGestureSource()!=目标&&
event.getDragboard().hasImage()){
/*允许移动*/
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragEntered(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
/*拖放手势进入目标*/
/*向用户显示它是实际的手势目标*/
如果(event.getGestureSource()!=目标&&
event.getDragboard().hasImage()){
target.setStyle(“-fx背景色:粉色”);
}
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragExited(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*鼠标移开,移除图形提示*/
target.setStyle(“-fx背景色:蓝色”);
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragDrop(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*数据丢失*/
/*如果拖板上有字符串数据,请读取并使用它*/
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hasImage()){
target.setStyle(“-fx背景色:绿色”);
成功=真实;
}
/*让源知道字符串是否已成功删除
*转让和使用*/
事件。setDropCompleted(成功);
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragDone(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*数据丢失*/
/*如果拖板上有字符串数据,请读取并使用它*/
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hasImage()){
target.setStyle(“-fx背景色:黄色”);
成功=真实;
}
/*让源知道字符串是否已成功删除
*转让和使用*/
事件。setDropCompleted(成功);
event.consume();
}
});
}
}
setOnDragDone(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*拖放手势结束了*/
/*如果数据已成功移动,请将其清除*/
if(event.getTransferMode()==TransferMode.MOVE){
pictureOne.setOpacity(0.0);
}
event.consume();
}
});
}
到目前为止,除了setOnDragDone
部分没有将颜色更改为绿色(但我将在稍后处理该部分)之外,拖动在大部分情况下都有效
我的问题是,当我开始拖动时,是否仍然可以设置正在拖动的图像的大小(而不是显示的原始图像的完整大小)。如果没有,我是否仍然可以拖动图像,但不显示正在拖动的图像,只需更改目标的颜色 首先是一个非常简单的建议,为什么有五个单独的“for”循环来为同一组节点设置不同的拖动处理程序。您只能在一个for循环中完成所有操作
for(Node target: playerGrid.getChildren()) {
if(target.getId() != null) {
target.setOnDragOver(..);
target.setOnDragEntered(..);
target.setOnDragExited(..);
target.setOnDragDropped(..);
target.setOnDragDone(..);
}
}
说到实际问题,要调整图像大小并在dragboard中设置,可以使用“快照”功能。检查以下代码以设置已调整大小的ima
double displaySize = 150;
double dragSize = 50;
ImageView pictureOne = new ImageView(new Image(ImageDragDemo.class.getResourceAsStream(imgName)));
pictureOne.setFitHeight(displaySize);
pictureOne.setFitWidth(displaySize);
pictureOne.setOnDragDetected(event -> {
Dragboard db = pictureOne.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
// Resizing the image to required size before taking the snapshot.
pictureOne.setFitHeight(dragSize);
pictureOne.setFitWidth(dragSize);
content.putImage(pictureOne.snapshot(null,null));
// Resetting the image to initial size after taking the snapshot.
pictureOne.setFitHeight(displaySize);
pictureOne.setFitWidth(displaySize);
db.setContent(content);
event.consume();
});
ImageView dragImage = new ImageView(pictureOne.getImage());
dragImage.setFitHeight(dragSize);
dragImage.setFitWidth(dragSize);
content.putImage(dragImage.snapshot(null,null));
// Instead of content.putImage(..) use
content.putString("DRAG_IMAGE");
..
// And instead of checking using event.getDragboard().hasImage() use
event.getDragboard().hasString() && event.getDragboard().getString().equals("DRAG_IMAGE")