2015-03-23 2 views
0

Я работаю над приложением, где я могу перетащить ImageView в любом месте на сцену. Когда я запускаю приложение, он отлично работает в первый раз, когда я перетаскиваю ImageView, но не отвечаю после его выпуска.Почему JavaFX принимает события мыши только один раз?

Вот мой FXML Контроллер:

@FXML 
private ImageView card; 

@FXML 
private void handleCardMousePressed(MouseEvent event) { 
    System.out.println("Drag Entered"); 
    DropShadow dropShadow=new DropShadow(); 
    dropShadow.setColor(Color.rgb(18,139,237)); 
    dropShadow.setSpread(.48); 
    card.setEffect(dropShadow); 
    card.setMouseTransparent(true); 
    event.consume(); 
} 

@FXML 
private void handleCardMouseDragged(MouseEvent event){ 
    System.out.println("In Drag"); 
    card.setLayoutX(event.getSceneX()); 
    card.setLayoutY(event.getSceneY()); 
    event.consume(); 
} 
@FXML 
private void handleCardMouseReleased(MouseEvent event){ 
    System.out.println("Exit Drag"); 
    card.setEffect(null); 
    event.consume(); 
} 

Video of What is Happening

ответ

1

Не устанавливайте mouseTransparent в true в методе handleMouseCardPressed.

Если вам нужно сделать, это какой-то другой причине (я не могу понять, почему вы бы), то в handleCardMouseReleased(...) вам необходимо установить mouseTransparent обратно в ложь:

card.setMouseTransparent(false); 

Полный пример:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class DragImageViewExample extends Application { 

    private ImageView card; 

    @Override 
    public void start(Stage primaryStage) { 
     Rectangle rect = new Rectangle(30, 30, Color.CORAL); 
     card = new ImageView(rect.snapshot(null, null)); 

     card.setOnMousePressed(this::handleCardMousePressed); 
     card.setOnMouseDragged(this::handleCardMouseDragged); 
     card.setOnMouseReleased(this::handleCardMouseReleased); 

     Pane pane = new Pane(card); 
     Scene scene = new Scene(pane, 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void handleCardMousePressed(MouseEvent event) { 
     System.out.println("Drag Entered"); 
     DropShadow dropShadow=new DropShadow(); 
     dropShadow.setColor(Color.rgb(18,139,237)); 
     dropShadow.setSpread(.48); 
     card.setEffect(dropShadow); 
     event.consume(); 
    } 

    private void handleCardMouseDragged(MouseEvent event){ 
     System.out.println("In Drag"); 
     card.setLayoutX(event.getSceneX()); 
     card.setLayoutY(event.getSceneY()); 
     event.consume(); 
    } 

    private void handleCardMouseReleased(MouseEvent event){ 
     System.out.println("Exit Drag"); 
     card.setEffect(null); 
     event.consume(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
Смежные вопросы