эмиссия событий в Java

mama10001

Вопрос первый. Если можно вызывать эмиссию событий в Java, то как?
Например создать событие myEvent = new ActionEvent(myComponent, “cmd” сделать emit(myEvent) и оно будет доставлено по назначению.
Вопрос второй. Можно ли в самой программе перехватывать весь поток событий поступающий от JVM к компонентам приложения, не внедряя в каждый компонент своего слушателя?

Ann328

1 Видимо никакой эмиссии нет, по крайней мере не один свинговый компонент, не содержит методов для эмитации посылки ему сообщения.
Интересно откуда такой термин - эмиссия, сильно на физику похоже.
2 Все сообщения можно перехватывать в одном месте, по крайней мере в awt именно такая модель и реализована, однако как это сделать в свинге я не знаю.

rosali

откуда такой термин - эмиссия
англ. emit означает "испустить", в физике имеется в виду "испустить" частицу какую-нубудь или еще чего, а тут вот "испускаются" события. В .NET еще есть библиотека System.Reflection.Emit там IL инструкции "испускаются"

Hastya

Я так понял речь про десктопные приложения. Создавать событие не нужно, т.к. компонент его генерирует сам.
поток событий поступающий от JVM к компонентам приложения
? такого нет в джаве по поводу слушателя см. иерархию компонентов.

mama10001

Ты наверно имеешь ввиду перехват событий одного компонента, а нужно разных.
В общем мысль в этом направлении продвинулась

Toolkit.getDefaultToolkit.addAWTEventListener(
new AWTEventListener {
public void eventDispatched(AWTEvent event) {
log(event);
}
},
AWTEvent.WINDOW_EVENT_MASK |
AWTEvent.WINDOW_FOCUS_EVENT_MASK |
AWTEvent.WINDOW_STATE_EVENT_MASK |
AWTEvent.ACTION_EVENT_MASK |
AWTEvent.ITEM_EVENT_MASK |
AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.KEY_EVENT_MASK |
AWTEvent.FOCUS_EVENT_MASK |
AWTEvent.COMPONENT_EVENT_MASK |
AWTEvent.CONTAINER_EVENT_MASK);

mama10001

Создавать событие не нужно, т.к. компонент его генерирует сам.
Что значит не нужно? Мне нужно!
Ладно. Расскажу общую задачу.
Мы сначала пишем все события в лог.
А потом проигрываем их. И прога должна без участия юзера открывать диалоги, заполнять их данными, жать кнопки…
Если можно обойтись без эмиссии, то как?

Ann328

Имитировать события видимо все таки можно, например JButton порождается от AbstractButton, а у того есть метод fireActionEvent, но он protected.
Вообще задача очень интересная, надо будет посмотреть исходники свинга, чтобы увидеть откуда реально берутся события.
PS: плз, напиши если, что придумаешь

Hastya

посмотри java.awt.EventQueue

mama10001

А теперь внимание! Правильный ответ
java.awt.Robot

Hastya

Это разные вещи.
Using the class to generate input events differs from posting events to the AWT event queue or AWT components in that the events are generated in the platform's native input queue. For example, Robot.mouseMove will actually move the mouse cursor instead of just generating mouse move events.

mama10001

Я не сомневаюсь, что твой класс бы мне помог, но это сложный путь в случае если в апликации несколько сотен компонентов.
Робот – универсальный метод для решения этой задачи. Вообще очень забавно получилось Одно только не могу понять : когда мышь находится в области заголовка окна, будь то главное или диалоговое, события не поступают, поэтому перетащить окно за заголовок не возможно
Оставить комментарий
Имя или ник:
Комментарий: