создание MouseEvent в JavaFX

мне нужно имитировать MouseEvent.MOUSE_CLICKED. Я хочу использовать fireEvent метод конкретного узел для отправки события вышеупомянутого типа. Тем не менее, я борюсь с его созданием. Оказывается, что javafx.сцена.вход.События mouseevent не имеет допустимого конструктора, но старый java.awt.event.MouseEvent объекты могут быть созданы таким образом. Тем не менее, я не нашел никакого рабочего решения для преобразования. Как мне быть? это?

спасибо.

4 ответов


вы можете создать MouseEvent, используя устаревший MouseEvent.API для impl_mouseEvent. Я сделал это ранее в этом форум thread для JavaFX 2.0. Обратите внимание, что API устарел по какой - то причине-это частный API, используемый в реализации JavaFX, и API не гарантирует сохранение той же подписи или даже существование в будущих версиях (что может быть подтверждено, потому что исходный код, который я разместил в потоке форума, больше не компилируется.

правильный решение для создания такого события должно иметь общедоступный API, поэтому поддержите это. Уже был подан запрос на предоставление этой функции RT-9383 "добавьте правильные конструкторы и заводские методы в классы событий, удалите impl". Этот jira планируется завершить в следующем году для JavaFX 3.0.

тем временем, использование класса роботов, как предлагает Сергей, вероятно, ваш лучший метод.


обновление: добавлена Java 8 общедоступные конструкторы для javafx.событие.События mouseevent и (как указано в ответе Джея Таккара), вы можете запустить такое событие, используя событие.fireEvent (можно события пожара на Windows).


это вызовет один основной щелчок мыши на вашем узле:

import javafx.event.Event; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent;

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

или вы можете использовать простой "хак", чтобы сделать программный нажмите на кнопку. Создайте этот метод в классе "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();
    }
}

затем, чтобы "нажать" на кнопку, просто вызовите метод нажать кнопку передав в качестве параметра.


когда вы устанавливаете обработчик, он устанавливает общественную собственность. Вы можете получить событие из этого свойства и вызвать handle ():

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