Swing: как создавать события и отправлять их компоненту? - PullRequest
7 голосов
/ 30 апреля 2009

Мне нужно отправить некоторые события компоненту в Swing, чтобы он обрабатывался так же, как и любые сгенерированные пользователем стандартные события Swing.

По сути, что-то вроде устройства записи макросов, а затем исполнителя для JEditorPane. Но мне нужно больше контроля над сгенерированными событиями.

ТАК, предположим, у меня есть редактор, я хочу:

  1. захватывает все события, отправленные ему, и в этот момент я могу сохранить их в списке, на диске или что-то еще.
  2. Позже вы сможете воспроизвести эти события
  3. Идеальная ситуация - позволить пользователю редактировать команды, которые содержат такие вещи, как:
    "клавиша типа A, выбор строки, удаление-выделение, курсор вверх, начало строки ..."

Ответы [ 3 ]

6 голосов
/ 30 апреля 2009

Очевидное, что нужно сделать, это получить EventQueue и опубликовать на нем события. Это просто добавило бы событие в очередь, которая, в свою очередь, будет отправлена ​​на EDT.

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);

Кто-то вчера заявил, что Opera и Safari делают свое дело и не дают необходимого разрешения для ненадежного кода.

Прямой способ сделать это - позвонить Component.dispatchEvent.

3 голосов
/ 30 апреля 2009

Если вы ищете стандартные события в графическом интерфейсе, вам нужен java.awt.Robot

Если вы хотите определить свои собственные события, вам нужно будет создать подкласс для классов GUI, которые должны получать эти события (или, лучше, создать для них внешний контроллер), определить класс событий и отправить события. Вы можете использовать java.beans.EventHandler для отправки, создания своего собственного класса обработчика (я нашел это более полезным в некоторых случаях) или для вставки ваших событий (в зависимости от того, как они наследуются) в очередь системных событий (не могу найти класс, чтобы сделать это ... Я думал, что это был Инструментарий).

Однако я бы не стал делать ничего из этого. То, что вы описываете (макро-рекордер), должно быть реализовано с использованием контроллера, который генерирует / получает серию сообщений о действиях для конкретного приложения (см. Шаблон Command).

2 голосов
/ 30 апреля 2009

Я считаю, что вам нужно создать экземпляр события, а затем вызвать

java.awt.EventQueue.dispatchEvent(event)

Установите источник события для нужного компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...