2009-04-30 3 views
7

Ho bisogno di inviare alcuni eventi a un componente in Swing, quindi viene gestito come qualsiasi utente generato, eventi Swing standard.Swing: come creare eventi e inviarli a un componente?

Fondamentalmente, qualcosa come un registratore di macro e quindi un esecutore per JEditorPane. Ma ho bisogno di più controllo sugli eventi generati.

SO, assumere ho un editore, voglio:

  1. acquisire tutti gli eventi ad esso inviati, ea quel punto, posso memorizzarli in lista, su disco, o whatver ..
  2. È possibile riprodurre in seguito quegli eventi
  3. La situazione ideale consiste nel consentire all'utente di modificare un comando che contiene cose come:
    "digitare il tasto A, selezionare la riga, eliminare la selezione, il cursore su, il punto iniziale. . "
+0

La tua domanda non è chiara. –

risposta

3

Se siete alla ricerca di eventi GUI standard, allora si vuole java.awt.Robot

Se stai cercando di definire i propri eventi, si sta andando ad avere per creare una sottoclasse le classi GUI che hanno bisogno di ricevere tali eventi (o meglio, crea un controller esterno per loro), definisci una classe di eventi e invia gli eventi. Puoi usare java.beans.EventHandler per inviare, creare la tua classe di gestore (che ho trovato più utile in occasioni) o iniettare i tuoi eventi (a seconda di come li ereditano) nella coda degli eventi di sistema (non riesci a trovare la classe per farlo ... pensavo fosse Toolkit).

Tuttavia, non farei nessuno di questi. Quello che descrivi (un registratore di macro) dovrebbe essere implementato usando un controller che genera/riceve una serie di messaggi di azione specifici dell'applicazione (guarda il modello di comando).

+0

Mi piace il suggerimento dei comandi. Ma non è riuscito a trovare nulla su come effettivamente farlo. – Ayman

+0

Senza sapere esattamente cosa si vuole fare, è difficile dare consigli concreti. Tuttavia, considera che un JEditorPane utilizza un javax.swing.text.Document per gestirne il contenuto ed è possibile allegare un DocumentListener per ricevere tutte le modifiche a questo documento. Se si salvano gli eventi di quel listener in un elenco, è possibile riprodurre l'elenco in qualsiasi momento e applicare le modifiche, oppure annullarle. – kdgregory

+0

Per ora almeno, mi piacerebbe un modo semplice ma programmabile di registrare e riprodurre macro su un editor. Il problema con il collegamento al documento è che il movimento di Caret non verrà inviato al documento. Quindi dovrò collegarmi agli eventi ricevuti/elaborati dal componente della GUI.Le azioni sembrano perfette, ma ho bisogno di un modo per collegarmi per vedere le azioni inviate (da registrare) e poi un modo per iniettare le azioni registrate/elaborate sul componente. MAny grazie. – Ayman

2

Credo che si deve costruire un'istanza della manifestazione e quindi chiamare

java.awt.EventQueue.dispatchEvent(event) 

impostare l'origine della manifestazione per il componente desiderato.

+1

EventQueue.dispatchEvent è un metodo di istanza protetto. Dovresti ottenere la coda degli eventi corrente e spingere una sottoclasse per usare quel metodo. –

+0

Che dire invece di postEvent()? –

+0

Oops. Sì, postEvent() sembra la risposta giusta. –

6

La cosa ovvia da fare è ottenere il EventQueue e pubblicare eventi su di esso. Questo semplicemente aggiungerebbe l'evento alla coda che verrà inviata a sua volta sull'EDT.

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

Qualcuno ha affermato ieri l'Opera e Safari fanno quello che vogliono e non danno autorizzato a codice non attendibile.

Un modo diretto per farlo è chiamare Component.dispatchEvent.

+0

Ho rintracciato il codice che utilizza 'Component.dispatchEvent' e, se non sto sbagliando, invocherà effettivamente il listener sul thread corrente? Il metodo 'postEvent' non è migliore poiché invoca il gestore sul thread EventQueue? – Jeach

+0

Si dovrebbe fare praticamente tutto con i componenti sull'EDT. (AWT afferma di essere completamente thread-safe, ma non lo è.) E naturalmente, come ho detto, c'è la cosa delle autorizzazioni. –