2012-07-19 41 views
6

Tôi cần mô phỏng một số MouseEvent.MOUSE_CLICKED. Tôi muốn sử dụng phương thức phương thức fireEvent của một số Node cụ thể để gửi một sự kiện thuộc loại nói trên. Tuy nhiên, tôi đang đấu tranh với việc tạo ra một. Có vẻ như javafx.scene.input.MouseEvent không có hàm tạo hợp lệ, nhưng các đối tượng cũ java.awt.event.MouseEvent có thể được khởi tạo theo cách này. Tuy nhiên, tôi đã không tìm thấy bất kỳ giải pháp làm việc nào để chuyển đổi. Làm thế nào để tôi đi xung quanh điều này?tạo MouseEvent trong JavaFX

Cảm ơn.

+0

bạn có thể mô phỏng click chuột sử dụng 'java.awt.Robot.mouse *' phương pháp –

+0

đúng, nhưng làm thế nào để chuyển đổi 'java.awt. event.MouseEvent' đến 'javafx.scene.input.MouseEvent'? Chữ ký phương thức xử lý sự kiện thực tế yêu cầu ** MouseEvent ** từ javafx. * Gói – XXL

+2

nếu bạn đang sử dụng lớp Robot, nó sẽ mô phỏng cú click chuột, cơ sở hạ tầng Java FX sẽ tự bắt và tạo tất cả các lớp được yêu cầu. Bạn chỉ cần nói smth như 'Robot.mousePress (10,10)' cho điều đó. –

Trả lời

8

Bạn có thể tạo MouseEvent bằng cách sử dụng API MouseEvent.impl_mouseEvent không được chấp nhận. Tôi đã làm điều này trước đây trong này forum thread cho JavaFX 2.0. Lưu ý rằng API không được chấp nhận vì một lý do - đó là API riêng được sử dụng trong việc triển khai JavaFX và API không được bảo đảm duy trì cùng một chữ ký hoặc thậm chí tồn tại trong các phiên bản sau (có thể được chứng minh vì mã gốc tôi đã đăng trong chủ đề diễn đàn không còn biên dịch

Giải pháp chính xác để tạo sự kiện như vậy là có API công khai để hỗ trợ điều này. Đã có yêu cầu được đệ trình để cung cấp chức năng này RT-9383 "Add proper constructors & factory methods to event classes, remove impl".Jira này dự kiến ​​sẽ hoàn thành vào năm tới cho JavaFX 3.0.

Trong khi chờ đợi, việc sử dụng lớp Robot như Sergey gợi ý có lẽ là phương pháp tốt nhất của bạn,


Cập nhật: Java 8 thêm public constructors for javafx.event.MouseEvent và (như được chỉ ra trong câu trả lời Jay Thakkar của), bạn có thể bắn như một sự kiện sử dụng Event.fireEvent (bạn cũng có thể fire events on Windows).

+0

Khá là một câu trả lời phức tạp. Cảm ơn bạn. – XXL

+0

không thể truy cập Jira – Arne

+0

Truy cập Jira hoạt động cho tôi. Các nhà xây dựng sự kiện mới đã được thêm vào [nhánh Java 8] (https://jdk8.java.net/download.html) sẽ được phát hành vào năm tới. – jewelsea

12

này sẽ cháy một click chuột chính duy nhất tại nút của bạn:

Event.fireEvent(YOUR NODE, new MouseEvent(MouseEvent.MOUSE_CLICKED, 0, 
       0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true, 
       true, true, true, true, true, true, null)); 
+0

Các gói tham khảo: nhập javafx.event.Event; nhập javafx.scene.input.MouseButton; nhập javafx.scene.input.MouseEvent; – user1053510

2

Hoặc bạn có thể sử dụng một "hack" để làm một nhấp chuột chương trình đơn giản vào nút. Tạo phương pháp này trong một lớp học "util":

public static void click(javafx.scene.control.Control control) { 
    java.awt.Point originalLocation = java.awt.MouseInfo.getPointerInfo().getLocation(); 
    javafx.geometry.Point2D buttonLocation = control.localToScreen(control.getLayoutBounds().getMinX(), control.getLayoutBounds().getMinY()); 
    try { 
     java.awt.Robot robot = new java.awt.Robot(); 
     robot.mouseMove((int)buttonLocation.getX(), (int)buttonLocation.getY()); 
     robot.mousePress(InputEvent.BUTTON1_MASK); 
     robot.mouseRelease(InputEvent.BUTTON1_MASK); 
     robot.mouseMove((int) originalLocation.getX(), (int)originalLocation.getY()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Sau đó, để "click" vào nút chỉ cần gọi phương pháp nhấp chuột qua nút bấm của bạn là tham số.

1

Khi bạn đặt trình xử lý, nó sẽ đặt thuộc tính công khai. Bạn có thể nhận sự kiện từ tài sản đó và gọi xử lý():

button1.setOnMouseClicked().... 
the corresponding property is 
button1.onMouseClickedProperty().get().handle(me);//where me is some MouseEvent object 
Các vấn đề liên quan