sztuczne wywołanie ActionListener

0

Stworzylem sobie klase:

class FieldListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        ... 
    }
}
FieldListener fl = new FieldListener();

oraz pole:

pole = new JTextField("zawartosc");
...
pole.addActionListener(fl);

Chciałbym sztucznie wygenerowac zdarzenie zatwierdzenia wpisanego tekstu klawiszem enter.

0

Możesz jaśniej? Chcesz by
a) użytkownik mógł zatwierdzać wprowadzone dane Enterem?
b) program sam z siebie w losowej chwili generował ActionListenera?
c) o coś jeszcze innego?

0
bo napisał(a)

b) program sam z siebie w losowej chwili generował ActionListenera?

O to mi wlasnie chodzi. :) Program zachowa sie jak gdyby uzytkownik wpisal cos do pola i wcisnal enter.

0
fl.actionPerformed(null);

?

0

@mgs_saladin:
To nie takie proste. W jaki sposób proponowane przez Ciebie wywołanie ma oznaczać wciśnięcie klawisza Enter?

Rozumiem, że autorowi chodzi o dokładnie zasymulowanie tego zdarzenia. Czyli chodzi nie tylko o odpalenie obiektów nasłuchujących dla (dowolnych) akcji, ale i przekazanie im odpowiedniego obiektu ActionEvent?

Funkcje przetwarzające akcje mogą używać tego argumentu, by wykonać różne kawałki kodu w zależności od rodzaju akcji.

Dodatkowo, pole może mieć wiele obiektów nasłuchujących i odpalenie pojedynczego fl.actionPerformed nie odpali naturalnie pozostałych.

Nie jest to więc coś, czego chciał autor tematu (a przynajmniej napisał, że chciał).

0

Mozesz zrobic podklase JTextField, i za jej pomoca wystawic metode JTextField.fireActionPerformed() ktora jest protected, i pozniej samemu wywolywac ta metode w momencie gdy sie chce zasymulowac. Zagwarantowane jest wtedy ze tak jak mowi pan Swierczynski zostana powiadomione wszystkie listenery.
Tylko nie rozumiem w czym problem - wcisniecie klawisza enter w JTextField samo w sobie generuje ActionEvent, czy sie myle?

0
bswierczynski napisał(a)

@mgs_saladin:
To nie takie proste. W jaki sposób proponowane przez Ciebie wywołanie ma oznaczać wciśnięcie klawisza Enter?

Rozumiem, że autorowi chodzi o dokładnie zasymulowanie tego zdarzenia. Czyli chodzi nie tylko o odpalenie obiektów nasłuchujących dla (dowolnych) akcji, ale i przekazanie im odpowiedniego obiektu ActionEvent?

Funkcje przetwarzające akcje mogą używać tego argumentu, by wykonać różne kawałki kodu w zależności od rodzaju akcji.

Dodatkowo, pole może mieć wiele obiektów nasłuchujących i odpalenie pojedynczego fl.actionPerformed nie odpali naturalnie pozostałych.

Nie jest to więc coś, czego chciał autor tematu (a przynajmniej napisał, że chciał).

Dokladnie tak jak piszesz. Rozwine troche moja mysl.
Przykladowo obiektow JTextField bedziemy mieli kilka, a w funkcji actionPerformed chcemy odwolac sie do konkretnego obiektu, w ktorym nastapilo zdarzenie poprzez konstrukcje
((JTextField)e.getSource()).getText()
Na dodatek zdarzeniem ktore ma miec miejsce jest wlasnie wcisniecie klawisze Enter, a nie dowolna akcja.

edit

:: napisał(a)

Mozesz zrobic podklase JTextField, i za jej pomoca wystawic metode JTextField.fireActionPerformed() ktora jest protected, i pozniej samemu wywolywac ta metode w momencie gdy sie chce zasymulowac. Zagwarantowane jest wtedy ze tak jak mowi pan Swierczynski zostana powiadomione wszystkie listenery.
Tylko nie rozumiem w czym problem - wcisniecie klawisza enter w JTextField samo w sobie generuje ActionEvent, czy sie myle?

Spodziewalem sie wlasnie takiej gotowej metody w klasie JTextField. Cos na wzor tego:
pole.symulujZdarzenie(rodzajZdarzenia);

1

Na pewno temat już dawno nieaktualny, ale na pewno mnóstwo osób przewinie się jeszcze przez ten wątek [podobnie jak ja]. Spróbujcie tego:

try {
    Robot robot = new Robot();
    
    // Simulate a mouse click
    robot.mousePress(InputEvent.BUTTON1_MASK);
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    
    // Simulate a key press
    robot.keyPress(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_A);
} catch (AWTException e) {
    e.printStackTrace();
}
0

Nie dodałam jeszcze, że klasa Robot pochodzi oczywiście z java.awt.* ...

0

@navra hmm...człowiek z rana wstanie i takie coś przeczyta i znowu się czegoś dowie. Ja osobiście pisałem w javie takie rzeczy korzystająć z winapi (tak wiem , to tylko pod winde - ale było takie załozenie projektu).

Za KeyEvent.VK_A kryje się implementacja funkcji z user32: keybd_event.... DO zastosowania tylko w Twojej aplikacji to sposób przedstawiony przez navra wystarcza. Jeżeli natomiast chciałbyś aby symulowanie wpisania tekstu było gdziekolwiek to już trzeba korzystać z funkcji systemowcyh.

Ciekawym programikiem który kiedyś napisałem w Javie było otwieranie kalkulatora windows, symulowanie wpisania kilku działań, skopiowanie wyniku do formatki Javy i zamknięcie kalkulatora (taka szpana-ale wierzcie mi że były też pragmatyczne zastosowania).

Tak btw jestem ciekaw jaki jest odpowiednik keybd_event w linuxie i gdzie go znaleźć?

Pozdrawiam

0

K$#@a gosciu, przeczytaj co autor chcial zrobic, kiedy chcial to zrobic, i przestan pierdzielic o jakichs funkcjach systemowych i otwieraniu kalkulatora - co ma piernik do wiatraka? O i tak nie ma sie czym chwalic.

0

nerwowy jesteś:)

A tak na poważnie to nie wiem dlaczego się do mnie przyczepiasz...jak temat odkopał navra. A poza tym jest taka zasada, że zanim się zada pytanie na forum pierw samemu się szuka na forum. A jak się znajdzie rozwiazanie to nie trzeba znowu zakładać tematu. Przeczytałem co kolo chciał zrobić i ch... a nie rozwiązanie znalazł. Drugi będzie miał problema i znowu da temat a tak navra dał odpowiedz.

Zamiast zaśmiecać forum nerwowymi postami byś odpisał mi na pytanie...bo przecież je na poważnie zadawałem. Java nie kończy się na wyjebanym obiekcie...czasami jeszcze trzeba połączyć z nią fizyczny sprzęt.

0

Czy będzie tylko jeden listener do tej akcji?

Jeżeli tak, to rozwiązanie jest proste-przenieść logikę do zewnętrznej metody, którą będzie wywoływał listener oraz będzie można wywołać ręcznie.

public class Main {
   public void f1() {
      ... - implementacja
    }

   class FieldListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
        Main.this.f1();
      }
   }
}

Jeżeli sami chcemy zasymulować wciśnięcie klawisza, to wywołujemy f1()

Można też zrezygnować z klasy wewnętrznej i dodać metodę actionPerformed bezpośrednio do klasy Main, ale w tym przypadku, jeżeli mamy kilka przycisków, to trzeba patrzeć na źródło zdarzenia.

0
lipkerson napisał(a)

@navra hmm...człowiek z rana wstanie i takie coś przeczyta i znowu się czegoś dowie. Ja osobiście pisałem w javie takie rzeczy korzystająć z winapi (tak wiem , to tylko pod winde - ale było takie załozenie projektu).

Za KeyEvent.VK_A kryje się implementacja funkcji z user32: keybd_event.... DO zastosowania tylko w Twojej aplikacji to sposób przedstawiony przez navra wystarcza. Jeżeli natomiast chciałbyś aby symulowanie wpisania tekstu było gdziekolwiek to już trzeba korzystać z funkcji systemowcyh.

Ciekawym programikiem który kiedyś napisałem w Javie było otwieranie kalkulatora windows, symulowanie wpisania kilku działań, skopiowanie wyniku do formatki Javy i zamknięcie kalkulatora (taka szpana-ale wierzcie mi że były też pragmatyczne zastosowania).

Tak btw jestem ciekaw jaki jest odpowiednik keybd_event w linuxie i gdzie go znaleźć?

Pozdrawiam

[rotfl]

A słyszałeś o klasie Robot?
http://download.oracle.com/javase/6/docs/api/java/awt/Robot.html
Współczuję ludziom, którzy uważają, że bez tego winapi, to nic nie da się zrobić.

0

@__krzysiek85

Przeczytaj post navra, potem przeczytaj co ja napisałem-chyba jest w moim poście że navra podał świetną odpowiedz i sam się czegoś dowiedziałem i właśnie chodziło o klasę Robot:)

Ale musisz zauważyć niuans: robot tylko działa w TWOJEJ apliakcji, winapi wywołane z Javy działa WSZĘDZIE - kumasz różnice. Chcesz pragmatyczny przykład?

PS: Chyba zaśmiecamy forum już

0

O czym Wy w ogole piszecie, przeciez odpowiedz dostal dawno.
@lipkerson: winapi wywolane z javy dziala wszedzie? Brawo.

0

wszędzie w windows czepialski a nie WSZĘDZIE-stąd moje pytanie o odpowiednik w linuchu. Nie rób znowu ze mnie...zamknijcie ten temat.

0
lipkerson napisał(a)

Nie rób znowu ze mnie...

Dobrze. W sumie nie musze.

0

lipkerson:
Skoro prawie wszystko robisz w WinAPI a kod w Javie jest tylko po to, żeby móc korzystać z istniejących bibliotek w Javie to może zamiast wywoływać C++ z Javy wywołasz Javę z C++? :)

0

Lipkerson, nie rozumiem w ogóle o co Ci chodzi. Klasa Robot ma nie działać pod Linuksem? Działa bez problemów. Po co w ogóle interesować się jakimś WinAPI przy jej użyciu?

0

liepkerson chce chyba zrobić autohotkeya w Javie :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1