-
Romantyczny Buntowniś
Czy ma ktos doswiadczenie z klasa: java.awt.event.KeyEvent ?
A konkretnie czy jest mozliwe z danego Stringa potworzyc objekty tej klasy odpowiadajace kolejnym znakom w Stringu? Jesli jest to jak?
Robie mala aplikacje z elementami dzialajacymi na zasadze makra: maja "wystukiwac" na klawiaturze ciagi znakow zapisane w formie Stringow.
Moze ktos ma inny pomysl implementacji niz przy uzycu wyzej wspomnianego KeyEvent'a ? -
mystery
Jak to maja wystukiwac na klawiaturze?
KeyEvent to reakcja (np wywolanie jakiejs metody) na wcisniecie klawisza, wiec mozesz np wywolywac ta metode dla kazdego znaku w stringu osobno, co powinno dac ten efekt. Nie znam szczegolowo problemu wiec nie wiem za bardzo o co konkretnie chodzi -
Romantyczny Buntowniś
nie calkiem...
utworzenie KeyEventa moze byc efektem wcisniecia klawisza jak piszesz, jednak nie musi. KeyEvent moze byc tez wykorzystany w nastepujacy sposob:
kazesz programowi w jakims polu tekstowym "wpisac" jakies znaki, tak jakby ktos je z klawiatury wpisywal. Do tego trzeba dac takiemu programowi KeyEventy odpowiadajace tym znakom.
Wlasnie cos w tym stylu bym chcial zrobic, problem polega na tym ze mam Stringa i nie wiem jak na jego podstawie KeyEventy potworzyc. -
Eric Wu
Jak rozumiem masz aplikację i chcesz w niej dodać możliwość robienia makr i chciałeś to zrobić tak, że string makra jest parsowany do tablicy KeyEventów, a następnie jest iteracja po tej tablicy i dla każdego KeyEventa jest wywoływana metoda listenera pobierająca ten KeyEvent i coś w aplikacji wykonująca, czy tak?
Nie jestem pewien, czy to dobry pomysł (trochę mało doświadczenia z aplikacjami desktopowymi/appletami, bardziej działam w JEE), ale podejrzewam, że nie bardzo. Spójrz na konstruktor KeyEvent. Ja bym tego nie próbował tworzyć. Chociażby dlatego, że niektóre pola wydają się być zagadką (np. nie bardzo wiem co bym miał wstawić jako id - chociaż może to obojętne, bo i tak to dostaje metoda napisana przez Ciebie), a poza tym trzeba by było zrobić jakieś mapowanie char -> keyCode.
Jeśli sterowanie poprzez zdarzenia klawiatury polega tylko na sprawdzeniu jaką literkę/cyferkę/znak użytkownik kliknął, to może lepiej przenieść sterowanie z key listenera do osobnej metody biorącej za parametr char, a w key listenerze zrobić wywołanie "getKeyChar()" na KeyEvencie i jeśli nie jest CHAR_UNDEFINED, to przekazać znak do metodzie sterującej, która już zrobi co trzeba na podstawie tego jaki to jest znak (a jak jest CHAR_UNDEFINED to jakoś ewentualnie inaczej obsłużyć w key listenerze).
A w metodzie robiącej za makro zamienić stringa na tablicę znaków i przeiterować ją dla każdego wywołując metodę sterującą (tą co wcześniej z key listenera).
Ewentualnie w ostateczności zrobić wrapper na KeyEventa i chara (klasę, która ma 2 pola KeyEvent i char i konstruktor przyjmujący jedno lub drugie) implementujący interface Comparable, oprogramować go tak, by pozwalał się porównywać z intem określającym key code KeyEventu (jeśli zawiera KeyEvent nie null, to porównuje z jego key code, jeśli zaś char to używa napisanego własnoręcznie mapowania char->key code, nie wiem czy jest jakaś metoda to robiąca, trochę wątpię), dalej zaś zrobić tak jak wcześniej z oddzielną metodą sterującą - keylistener robi KeyEventWrapper zainicjowanego KeyEventem i przekazuje do sterującej metody, a makro inicjalizuje charem i też przekazuje do sterującej metody. Metoda w środku porównuje sobie te KeyEventWrapper z key code, które obsługuje i dalej wykonuje to, co ma zostać wykonane.
To taki mój pomysł, ale nie jestem pewny, czy dobry. -
-
Eric Wu
W jaki sposób zamierzasz "dawać" te KeyEventy?
To jest implementowane w ramach jednej aplikacji? -
Romantyczny Buntowniś
a wiec... w mojej aplikacji korzystam z klasy java.awt.Robot. Klasa ta ma takie metody jak np.: keyPress(int keycode), poprzez wywolanie jej z parametrem np. : keyPress(KeyEvent.VK_A) mozna osiagnac efekt taki jakby ktos na klawiaturze wlasnie wcisnal litere A.
Takie makra ma miedzy innymi oblugiwac moja aplikacja. Ale chce zeby makra mozna bylo dowolnie ustawiac (poprzez interface uzytkownika). Zostawalyby zapisame w bazie danych i z niej odczytywane.
Wszystko pieknie do momentu kiedy takie makro sie zdefiniuje (w wyzej wspomnianej logice uzytkownika) ktos sobie wklepie np ze chce zeby Makro "pisalo" tekst: Romantyczny Buntownik.
Uzytkownik wklepie mi to w interface w jakies pole tekstowe i ja takie wejscie moge sobie zapisac w mojej bazie danych ALE jako Stringi chary badz inne a nie jako KeyEventy.
Moje pytanie bylo czy ktos moze wie o jakims tricku jak efektywnie takie KeyEventy generowac na podstawie chara, bo jak juz wspomniales Ericu Wu konstruktory KeyEventow wygladaja raczej malo zachecajaco.
W najgorszym wypadku bede sam musial napisac klase ktora dla danego chara generuje KeyEvent odpowiadajacy znakowi z chara, ale myslalem ze obejde sie bez tego, bo rozgryzanie tych wszystkich parametrow w konstruktorze KeyEventa przyprawia mnie o bole glowy. -
Romantyczny Buntowniś
Hmm ... teraz jak tak czytam co wlasnie napisalem to mysle, ze moznaby zamiast odczytywac Stringa wpisanego w pole tekstowe, wylapywac KeyEventy podczas wpisywania takiego tekstu przez uzytkownika.
Zapisywac wtedy w bazie zaraz jako KeyEventy a nie Stringi czy chary. -
Eric Wu
Chyba potrzebujesz nie samych KeyEventow, a po prostu wartosci integer opisujacych key code key eventu.
To ja bym zrobil to jednak na stringach.
Potem w makro stringa zamienic na tablice charow i przeiterowac.
Mniej wiecej tak:
char[] znaki = String.toCharArray(makro);
for (char c : znaki) {
KeyStroke k = KeyStroke.getKeyStroke(c);
int keyCode = k.getKeyCode();
robot.keyPress(keyCode);
} -
Romantyczny Buntowniś
- Przeglądaj grona w kategorii Internet i Komputery
- Przeglądaj grona w okolicy Warszawa
- Załóż własne grono tematyczne
- Zostań moderatorem
Podobne Tematy
|
|
Wszystko co związane z programowaniem w Java (J2EE, JSP, JDBC, itd) test
Miejsca grona (1)
-
Kino Luna ul. Marszałkowska, Warszawa
www.kinoluna.pl kino.luna@maxfilm.com.pl 22 621 78 28
- Dodaj miejsce

