我正在製作一個遊戲,用戶需要將ImageView拖動到GridPane上,同時拖動它,我希望它們能夠按一個鍵旋轉ImageView。我只希望他們能夠在拖動ImageView時旋轉ImageView,因此我在拖動事件啓動時設置了KeyEvent處理程序,然後將其刪除。在JavaFX中同時處理KeyEvent和MouseEvent
這裏是將處理器設置代碼:
private void setPlacementHandlers()
{
setOnMouseMoved(event -> trackMouse(event));
setOnDragDetected(event -> pickedUp(event));
setOnDragDone(event -> placed(event));
}
這裏是OnDragDetected代碼:
private void pickedUp(MouseEvent event)
{
//Get variables from Ship
ShipPart[] parts = ship.getParts();
int shipSize = ship.getSize();
Dragboard db = this.startDragAndDrop(TransferMode.MOVE);
ship.getBoard().setDraggedPart(this);
ClipboardContent cbContent = new ClipboardContent();
cbContent.putImage(this.getImage());
db.setDragView(shipImage);
db.setDragViewOffsetX((partIndex * 50) + mouseX);
db.setDragViewOffsetY(mouseY);
db.setContent(cbContent);
setFocusTraversable(true);
requestFocus();
setOnKeyPressed(keyEvent -> rotate(keyEvent, db, cbContent));
getScene().onKeyPressedProperty().bind(this.onKeyPressedProperty());
for(int i = 0; i < shipSize; i++)
parts[i].setVisible(false);
event.consume();
}
下面是我使用的用於測試目的OnKeyPressed的臨時版本:
private void rotate(KeyEvent keyEvent, Dragboard db, ClipboardContent cbContent)
{
System.out.println("Potato");
}
我試過setFocusTraversable(true);和requestFocus();
出於調試的目的,我刪除了在拖動完成後刪除KeyEvent處理程序的代碼,並且事實證明KeyEvent在DragEvent之後正常工作,但沒有發生。
總之,問題並不在於ImageView沒有獲得KeyEvent,它幾乎看起來好像是由於DragEvent而沒有生成KeyEvent。
任何幫助表示讚賞。
更新:我也嘗試將KeyEvent處理程序添加到另一個對象,然後將更改應用到我想要更改的對象,但不起作用。我也嘗試了線程和任務的各種組合。
但我想從ImageView中處理KeyEvent,它是一個JavaFX節點,而不是從拖拽板上的任何東西。 –
當您執行拖放操作時,被拖動的對象不是您的ImageView。它是一個本機系統對象,它顯示傳遞給DragBoard.setDragView的圖像。在拖動過程中,沒有節點具有鍵盤焦點,因此不會看到按鍵。 – VGR
我知道被拖動的對象不是我的ImageView,但我不知道它阻止任何具有鍵盤焦點的節點。謝謝。 –