2009-04-30 12 views
7

Potrzebuję wysłać pewne zdarzenia do komponentu w Swingu, więc jest on obsługiwany tak jak każde wygenerowane przez użytkownika, standardowe zdarzenia Swing.Swing: jak tworzyć zdarzenia i wysyłać je do komponentu?

Zasadniczo coś jak rejestrator makr, a następnie executor dla JEditorPane. Ale potrzebuję większej kontroli nad wygenerowanymi zdarzeniami.

SO załóżmy mam edytor, chcę:

  1. przechwytywać wszystkie zdarzenia wysyłane do niego, iw tym momencie, można przechowywać je w liście, na dysku lub whatver ..
  2. Możliwość późniejszego odtworzenia tych zdarzeń
  3. Idealna sytuacja, to pozwolić użytkownikowi na edycję komend zawierających takie elementy jak:
    "klawisz typu A, wybierz linię, usuń zaznaczenie, kursor w górę, początek linii .. . "
+0

Twoje pytanie nie jest jasne. –

Odpowiedz

3

Jeśli szukasz standardowych zdarzeń GUI, to potrzebujesz java.awt.Robot

Jeśli chcesz zdefiniować swoje własne wydarzenia, będziesz musiał podklasować klasy GUI, które muszą odbierać te zdarzenia (lub lepiej, utwórz dla nich zewnętrzny kontroler), zdefiniuj klasę zdarzenia i wyślij zdarzenia. Możesz użyć java.beans.EventHandler, aby wysłać, utworzyć własną klasę obsługi (okazało się, że jest to bardziej przydatne przy okazji) lub wstrzyknąć twoje zdarzenia (w zależności od sposobu ich dziedziczenia) do kolejki zdarzeń systemowych (nie można znaleźć klasy, która to zrobi) ... Myślałem, że to Toolkit).

Jednak nie zrobiłbym żadnej z tych rzeczy. To, co opisujesz (rejestrator makr), powinno zostać zaimplementowane za pomocą kontrolera, który generuje/otrzymuje serię komunikatów akcji specyficznych dla aplikacji (patrz wzorzec poleceń).

+0

Podoba mi się twoja komenda wskazówka. Ale nie mógł znaleźć niczego, jak to zrobić. – Ayman

+0

Nie wiedząc dokładnie, co chcesz zrobić, trudno jest udzielić konkretnej porady. Należy jednak wziąć pod uwagę, że JEditorPane używa obiektu javax.swing.text.Document do zarządzania jego zawartością, i można dołączyć DocumentListener w celu otrzymania wszystkich zmian w tym dokumencie. Jeśli zapiszesz zdarzenia tego słuchacza na liście, możesz odtworzyć tę listę w dowolnej chwili i zastosować zmiany - lub cofnąć je. – kdgregory

+0

Na razie chciałbym mieć prosty, ale programowalny sposób nagrywania i odtwarzania makr w edytorze. Problem z dołączeniem do Dokumentu polega na tym, że ruch Caret nie zostanie przesłany do Dokumentu. Muszę więc podłączyć się do zdarzeń odebranych/przetworzonych przez komponent GUI.Akcje wydają się być świetnie dopasowane, ale potrzebuję sposobu na podpięcie się, aby zobaczyć wysłane akcje (do nagrywania), a następnie sposób wstrzyknięcia zarejestrowanych/przetworzonych działań z powrotem do komponentu. MAny dzięki. – Ayman

2

wierzę, że trzeba konstruować wystąpienie zdarzenia, a następnie zadzwonić

java.awt.EventQueue.dispatchEvent(event) 

ustawić źródło zdarzenia do pożądanego składnika.

+1

EventQueue.dispatchEvent to metoda chronionej instancji. Aby użyć tej metody, musisz pobrać bieżącą kolejkę zdarzeń i wcisnąć podklasę. –

+0

Co powiecie na postEvent()? –

+0

Ups. Tak, postEvent() wygląda na właściwą odpowiedź. –

6

Oczywistym wyjściem jest uzyskanie EventQueue i opublikowanie wydarzeń. Po prostu doda to zdarzenie do kolejki, która zostanie wysłana z kolei na EDT.

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

Ktoś zarzucił wczoraj, że Opera i Safari robią swoje i nie dają wymaganego pozwolenia na niezaufany kod.

Bezpośrednim sposobem zrobienia tego jest zadzwonić pod numer Component.dispatchEvent.

+0

Śledziłem kod, który używa "Component.dispatchEvent" i jeśli się nie mylę, to faktycznie będzie wywoływać detektor w bieżącym wątku? Czy metoda "postEvent" nie jest lepsza, ponieważ wywoła procedurę obsługi w wątku EventQueue? – Jeach

+0

Powinieneś robić prawie wszystko z komponentami na EDT. (AWT twierdzi, że jest bezpieczny dla wszystkich wątków, ale tak nie jest). Oczywiście, jak już wspomniałem, jest coś na temat uprawnień. –

Powiązane problemy