2012-07-19 7 views
6

Ich brauche eine MouseEvent.MOUSE_CLICKED simulieren. Ich möchte die fireEvent Methode eines bestimmten Node verwenden, um ein Ereignis des oben genannten Typs zu versenden. Ich habe jedoch Schwierigkeiten, einen zu generieren. Es scheint, dass javafx.scene.input.MouseEvent keinen gültigen Konstruktor hat, aber alte java.awt.event.MouseEvent Objekte können auf diese Weise instanziiert werden. Trotzdem habe ich keine funktionierende Lösung für die Konvertierung gefunden. Wie gehe ich das um?Erzeugen eines MouseEvent in JavaFX

Danke.

+0

Sie per Mausklick simulieren kann 'java.awt.Robot.mouse *' Methoden –

+0

direkt verwenden, aber wie konvertiere ich 'java.awt. event.MouseEvent 'zu' javafx.scene.input.MouseEvent'? Die Methodensignatur, die das tatsächliche Ereignis behandelt, erfordert das ** MouseEvent ** aus dem javafx. * Paket – XXL

+2

Wenn Sie die Robot-Klasse verwenden, simuliert es einen Mausklick, welche Java FX-Infrastruktur alle erforderlichen Klassen fängt und erstellt. Sie sagen einfach "robot.mousePress (10,10)" dafür. –

Antwort

8

Sie können ein MouseEvent mithilfe der veralteten MouseEvent.impl_mouseEvent-API generieren. Ich habe dies zuvor in diesem forum thread für JavaFX 2.0 getan. Beachten Sie, dass die API aus einem bestimmten Grund veraltet ist - es handelt sich um eine private API, die bei der Implementierung von JavaFX verwendet wird und nicht garantiert wird, dass die API die gleiche Signatur beibehält oder sogar in zukünftigen Versionen existiert (was durch den ursprünglichen Code in der Forum-Thread wird nicht mehr kompiliert

Die richtige Lösung zum Generieren eines solchen Ereignisses ist, eine öffentliche API zu haben, um dies zu unterstützen.Es wurde bereits eine Anfrage eingereicht, um diese Funktionalität RT-9383 "Add proper constructors & factory methods to event classes, remove impl" zu liefern.Diese Jira soll nächstes Jahr fertiggestellt werden für JavaFX 3.0.

In der Zwischenzeit Nutzung der Robot-Klasse als Sergey ist wahrscheinlich die beste Methode vorschlägt.


Update: Java 8 hinzugefügt public constructors for javafx.event.MouseEvent und die (wie in Jay Thakkar Antwort angezeigt wird), können Sie ein solches Ereignis feuern mit Event.fireEvent (Sie können auch fire events on Windows).

+0

Ziemlich ausgeklügelte Antwort. Vielen Dank. – XXL

+0

kann nicht auf Jira zugreifen – Arne

+0

Jira Zugriff funktioniert für mich. Die neuen Ereigniskonstruktoren wurden dem [Java 8-Zweig] (https://jdk8.java.net/download.html) hinzugefügt, der nächstes Jahr veröffentlicht werden soll. – jewelsea

12

Dies wird einen einzigen primären Mausklick auf Ihrem Knoten Feuer:

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

Pakete als Referenz: import javafx.event.Event; Import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; – user1053510

2

Oder Sie können einen einfachen „Hack“ verwenden, um einen programmatischen Klick auf der Schaltfläche zu tun. Erstellen Sie diese Methode in einer „Tool“ Klasse :

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(); 
    } 
} 

Dann auf „Klick“ auf die Schaltfläche rufen Sie einfach die Methode klicken, indem Sie Ihre Schaltfläche als Parameter.

1

Wenn Sie einen Handler festlegen, wird eine öffentliche Eigenschaft festgelegt. Sie können das Ereignis von dieser Eigenschaft erhalten und rufen handle():

button1.setOnMouseClicked().... 
the corresponding property is 
button1.onMouseClickedProperty().get().handle(me);//where me is some MouseEvent object