2009-04-30 17 views
7

Necesito enviar algunos eventos a un componente en Swing, por lo que se maneja como cualquier evento Swing estándar generado por el usuario.Swing: ¿cómo crear eventos y enviarlos a un componente?

Básicamente, algo así como un grabador de macros, y luego ejecutor para JEditorPane. Pero necesito más control sobre los eventos generados.

SO, supongamos que tengo un editor, quiero:

  1. captura todos los eventos enviados a él, y en ese momento, puedo guardarlos en la lista, en el disco, o whatver ..
  2. Ser capaz de reproducir más tarde esos eventos
  3. Situación ideal, es permitir al usuario editar comandos que contengan cosas como:
    "teclee la tecla A, seleccione línea, elimine-selección, cursor-arriba, inicio de línea ... . "
+0

Tu pregunta no está clara. –

Respuesta

3

Si está buscando eventos de GUI estándar, entonces quiere java.awt.Robot

Si está buscando definir sus propios eventos, tendrá que subclasificar las clases de la GUI que necesitan recibir esos eventos (o mejor, crea un controlador externo para ellos), define una clase de evento y envía los eventos. Puede usar java.beans.EventHandler para despachar, crear su propia clase de controlador (he encontrado eso más útil en ocasiones), o inyectar sus eventos (dependiendo de cómo heredan) en la cola de eventos del sistema (no puede encontrar la clase para hacer eso ... pensé que era Toolkit).

Sin embargo, yo no haría ninguno de estos. Lo que describes (un grabador de macros) debe implementarse usando un controlador que genere/reciba una serie de mensajes de acción específicos de la aplicación (mira el patrón de comando).

+0

Me gusta la sugerencia de tus comandos. Pero no pude encontrar nada sobre cómo hacerlo realmente. – Ayman

+0

Sin saber exactamente lo que quiere hacer, es difícil dar un consejo concreto. Sin embargo, considere que un JEditorPane utiliza un javax.swing.text.Document para administrar su contenido, y puede adjuntar un DocumentListener para recibir todos los cambios en este documento. Si guarda los eventos de ese oyente en una lista, puede volver a reproducir esa lista en cualquier momento y aplicar los cambios, o deshacerlos. – kdgregory

+0

Por ahora, al menos, me gustaría una forma simple pero programable de grabar y reproducir macros en un Editor. El problema con adjuntar al documento es que el movimiento Caret no se enviará al documento. Así que tendré que conectarme a los eventos recibidos/procesados ​​por el componente GUI.Las acciones parecen un gran ajuste, pero necesito una forma de conectarme para ver las acciones enviadas (para grabar) y luego una forma de inyectar las Acciones grabadas/procesadas al componente. MAny gracias. – Ayman

2

Creo que usted tiene que construir una instancia del evento y luego llamar

java.awt.EventQueue.dispatchEvent(event) 

Establecer el origen del evento al componente deseado.

+1

EventQueue.dispatchEvent es un método de instancia protegida. Tendría que obtener la cola de eventos actual y presionar una subclase para usar ese método. –

+0

¿Qué tal postEvent() en su lugar? –

+0

Vaya. Sí, postEvent() parece la respuesta correcta. –

6

Lo más obvio es obtener el EventQueue y publicar eventos en él. Eso simplemente agregaría el evento a la cola que se enviará a su vez en el EDT.

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

Alguien afirmó ayer la Opera y Safari hacer su propia cosa y no dan el permiso necesario para código no confiable.

Una forma directa de hacerlo es llamar al Component.dispatchEvent.

+0

He estado rastreando código que usa 'Component.dispatchEvent' y si no estoy confundiendo, ¿esto realmente invocará al oyente en el hilo actual? ¿No es mejor el método 'postEvent' ya que invocará el controlador en el hilo de EventQueue? – Jeach

+0

Debería estar haciendo casi todo con componentes en el EDT. (AWT afirma que todos son seguros para subprocesos, pero no lo es). Y, por supuesto, como mencioné, está el tema de los permisos. –

Cuestiones relacionadas