Jak zrobić, żeby KeyListener działał dla całej aplikacji, a nie tylko dla podanego obiektu? Tak, żebym mógł zczytać jaki klawisz został wciśniety, niezależnie od tego w jakim obiekcie teraz kursor jest.
nic błyskotliwego mi nie przychodzi do głowy. ponieważ model obsługi zdarzeń w Javie jest hierarchiczny, to musisz propagować zdarzenie w górę. co to znaczy?
piszesz obsługę KeyEventa dla aplikacji
piszesz obsługę dla np. TextField
teraz jeżeli kursor masz w polu textowym, naciskasz klawisz, to w obsłudze tego w TextField musisz wysłać zdarzenie w górę do aplikacji. to gorszy przypadek
w lepszym, jeśli nie obsługujesz tego eventa dla TF, to automatycznie zostanie skierowane do rodzica
JFrame f = new JFrame();
f.addKeyListener(listener);
em1x: niestety tak próbowałem i nie działa.
Teraz wpadłem na pomóc, żeby zrobić to na BufferedInputStream, ale jednak metoda read() działa tylko wtedy, jeśli skończe to enterem. Do tego to chyba by działało tylko w aplikacjach konsolowych... Nie ma innego sposobu, na zczytanie tego co się dzieje na klawiaturze, żeby zrobić prostą grę?
na frame'a wstaw panel ;) i daj sluchacza dla tego panel'a
ja tak zrobiłem sokobana. wtedy zczytuje wszystko.
aha dodaj jeszcze żeby po dowolnej akcji na dowolnym komponencie po za panelem kursor przenosił się na panel
Na uczelni mialem jako projekt napisanie gry, mniejsza z tym jakiej ;) i jakos smigalo bez problemu? Trzeba sie raczej bledu dopatrywac z tego, jak implementujesz akcje listenera.
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
class Test extends JFrame implements KeyListener {
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e)
{
JOptionPane.showMessageDialog(null, "" + e.getKeyChar());
}
public Test()
{
super("Testujemy klawisze");
addKeyListener(this);
getContentPane().add(new JLabel("press any button.."));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(200,200);
setVisible(true);
}
public static void main(String[] args)
{
new Test();
}
}
i powiedz mi ze to nie dziala? :/
nie działa w przypadku jednego klawisza. Esc mianowicie ;)
Chyba zartujesz?
nie nie żartuję :)
Java 1.5.0_05
JCreator
i Esc nie działa :|
Co ma JCreator do aplikacji javy? W jakim sensie nie dziala, bo u mnie jak najbardziej.
nie dziala w tym sensie że nie wyświetla dialoga :)
nic na to nie poradze :)
ale zauważyłem to już niejednokrotnie że z Esc jest problem. Java niekoniecznie dobrze go czyta :D
nie wiem z czego to wynika :( po prostu
mam windę 2ooo pro. ale przetestowałem Twój kod dzisiaj na uczelni na windzie xp. tam działa 8-|
Witam
Czy ktoś spotkał się z podobnym problemem nie działania keylistenera w apletach?
Jako ,ze aplet dziedzczy po panelu a nie po frame to niestety rozwiązania ,kotre tu podaliście nie działają.(przynajmniej u mnie)
pzdr
Podłączam się do tematu:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
class Test extends JFrame implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e)
{
JOptionPane.showMessageDialog(null, "" + e.getKeyChar());
}
public Test()
{
super("Testjujemy klawisze");
addKeyListener(this);
getContentPane().add(new JLabel("press any button.."));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(200,200);
setVisible(true);
setAlwaysOnTop(true);
}
public static void main(String[] args)
{
new Test();
}
}
Program działa wszystko fajnie.
Dodałem jedną linijkę setAlwaysOnTop(true);
Zależy mi na tym aby program reagował na klawisze gdy nie jest aktywny, lub jest np w tray'u.
Czy może nasłuchiwanie zdarzeń windowsa, jak by mógł ktoś mnie nakierować.
z góry dziękuję i pozdrawiam.
Nikt nie odpisał na mój post ale wyczytałem że chodzi o :
globalnego hooka
może komuś się przyda
Globalny hook...
http://4programmers.net/Forum/1099154
Tu jest całe rozwiązanie.