2012-07-19 11 views
6

Ho bisogno di simulare un MouseEvent.MOUSE_CLICKED. Desidero utilizzare il metodo fireEvent di un determinato nodo per inviare un evento del tipo sopra indicato. Tuttavia, sto lottando con la generazione di uno. Sembra che javafx.scene.input.MouseEvent non abbia un costruttore valido, ma gli oggetti vecchi java.awt.event.MouseEvent possono essere istanziati in questo modo. Tuttavia, non ho trovato alcuna soluzione funzionante per la conversione. Come faccio a fare questo?generazione di un mouseEvent in JavaFX

Grazie.

+0

è possibile simulare un clic del mouse utilizzando java.awt.Robot.mouse * '' metodi –

+0

destra, ma come faccio a convertire 'java.awt. event.MouseEvent' a 'javafx.scene.input.MouseEvent'? La firma del metodo che gestisce l'evento effettivo richiede ** MouseEvent ** dal pacchetto javafx. * – XXL

+2

se si utilizza la classe Robot simula il clic del mouse, che l'infrastruttura Java FX catturerà e creerà tutte le classi richieste da solo. Dite solo smth come "Robot.mousePress (10,10)" per quello. –

risposta

8

È possibile generare un MouseEvent utilizzando l'API MouseEvent.impl_mouseEvent deprecata. L'ho fatto precedentemente in questo forum thread per JavaFX 2.0. Si noti che l'API è deprecata per un motivo: è un'API privata utilizzata nell'implementazione di JavaFX e l'API non è garantita per mantenere la stessa firma o addirittura esistere nelle versioni future (il che può essere evidenziato perché il codice originale che ho postato nel thread del forum non compila.

La soluzione corretta per generare un tale evento è quello di avere un'API pubblica in modo da sostenere questo. C'è già stata una richiesta presentata per la fornitura di questa funzionalità RT-9383 "Add proper constructors & factory methods to event classes, remove impl". questo jira è previsto per essere completato il prossimo anno per JavaFX 3.0.

Nel frattempo, l'utilizzo della classe Robot come suggerisce Sergey è probabilmente la miglior metodo.


Aggiornamento: Java 8 aggiunto public constructors for javafx.event.MouseEvent e (come indicato nella risposta di Jay Thakkar), si può sparare un tale evento utilizzando Event.fireEvent (si può anche fire events on Windows).

+0

Abbastanza una risposta elaborata. Grazie. – XXL

+0

non può accedere a Jira – Arne

+0

L'accesso Jira funziona per me. I nuovi costruttori di eventi sono stati aggiunti al [ramo Java 8] (https://jdk8.java.net/download.html) per essere rilasciato l'anno prossimo. – jewelsea

12

Ciò sparare un solo clic del mouse primario a nodo:

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

Pacchetti di riferimento: import javafx.event.Event; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; – user1053510

2

oppure è possibile utilizzare un semplice "hack" per fare un clic sul pulsante programmatica. Creare questo metodo in una classe "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(); 
    } 
} 

Poi, per "click" sul pulsante basta chiamare il metodo click passando il pulsante come parametro.

1

Quando si imposta un gestore, imposta una proprietà pubblica. È possibile ottenere l'evento da quella proprietà e chiamare maniglia():

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