2015-06-27 88 views
2

我正嘗試構建一個javafx應用程序,在該應用程序中我需要響應鼠標移動並將它們點擊在一起,就像在拍攝時發生在反擊中一樣。但問題是當我按下鼠標按鈕時,它不會響應鼠標移動,直到我釋放鼠標按鈕。我希望他們兩個並行工作。我試圖在不同的線程中設置我的聽衆,但它不起作用。這是一個槍指針的圖像。處理鼠標移動並在javafx中一起點擊

Image image = new Image("/pointer.png"); // a 25*25 PNG icon 
ImageView imageView = new ImageView(image); 
scene.setCursor(Cursor.NONE); 

然後:

scene.setOnMouseMoved(e -> { 
     imageView.setX(e.getX()); 
     imageView.setY(e.getY()); 
    }); 

scene.setOnMousePressed(e -> Toolkit.getDefaultToolkit().beep()); 

我也試圖把它們放在單獨的線程,它不工作,要麼,但如果它確實存在的另一個問題是,我不能改變一個JavaFX的座標在另一個線程組件和我得到這個錯誤 - 即使它不會導致一個錯誤,它不會工作:

java.lang.IllegalStateException: Not on FX application thread 

scene.setOnMouseMoved(e -> { 
     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       imageView.setX(e.getX()); // here i cannot do stuff related 
       imageView.setY(e.getY()); // to javafx components 
      } 
     }; 

     thread.start(); 
    }); 

    scene.setOnMousePressed(e -> { 
     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       Toolkit.getDefaultToolkit().beep()); 
      } 
     }; 

     thread.start(); 
    }); 

我也試過,但它不工作,要麼

scene.setOnMouseMoved(e -> { 
     imageView.setX(e.getX()); 
     imageView.setY(e.getY()); 

     scene.setOnMousePressed(event -> Toolkit.getDefaultToolkit().beep()); 
    }); 

所以,我如何處理這個問題,我如何能夠響應鼠標點擊並行與鼠標移動沒有衝突。

回答

2

當單擊並保持鼠標時,而不是onMouseMoved使用onMouseDragged與相同的方法簽名。我相信應該滿足你的要求。

至於例外,只爲您的信息,以便在JavaFX應用程序的線程上運行的代碼只需調用Platform.runLater(some Runnable code);所以你的情況

Thread thread = new Thread() { 
     @Override 
     public void run() { 
      Platform.runLater(() -> { 
       imageView.setX(e.getX()); // this will now run fine 
       imageView.setY(e.getY()); 
      }); 
     } 
    }; 

儘管如此,也絕對不需要額外的線程,因爲事件的捕獲只會傳播到JavaFX應用程序線程。有各種方式來過濾或處理這些事件。有關活動的更多信息可以參考here

相關問題