Witam,
Moim głównym problemem jest napisanie programu, który wyświetli mi na ekranie małą grafikę i w zależności od przytrzymanego KURSORA, przemieści tą grafikę w odpowiednim kierunku (zgodnie z kursorem). Chcę nadmienić, że problem sam w sobie nie stanowi dla mnie kłopotu - potrafię to napisać. Problem pojawia się, kiedy chcę zlikwidować 'opóźnienie klawiatury'. Już tłumaczę:
Mając taki kod:
private class MyKeyListener implements KeyListener {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
obiekt.x--;
repaint();
}
if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
obiekt.x++;
repaint();
}
if (ke.getKeyCode() == KeyEvent.VK_UP) {
obiekt.x--;
repaint();
}
if (ke.getKeyCode() == KeyEvent.VK_DOWN) {
obiekt.x++;
repaint();
}
}
@Override
public void keyReleased(KeyEvent ke) {
}
}
przytrzymując klawisz strzałki, działa to tak: wykonuje się pierwsze przemieszczenie, następuje chwila przerwy (opóźnienie klawiaturowe), no i wreszcie obiekt przemieszcza się tak jak powinien.
Pomysł nr 1: Zlikwidować opóźnienie klawiaturowe. Wstępnie wydaje się być logiczne, jednak po 1. nie mam pojęcia jak to zrobić, a po 2. na różnych komputerach szybkość powtarzania przycisku może się różnić, a mi zależy na identycznym odstępie czasowym między przemieszczeniem obiektu na każdym komputerze.
Pomysł nr 2: Wykorzystać klasy Timer i TimerTask. I tu pojawia się moja prośba o pomoc, ponieważ siedzę już którąś godzinę z kolei i nie potrafię tego połączyć... Wstępnie kombinuję na jednym przycisku, żeby nie pisać za dużo błędnego kodu i próbuję np. tak:
private class MyKeyListener implements KeyListener {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
timer.schedule(new MyTimer(), 0, 50);
}
@Override
public void keyReleased(KeyEvent ke) {
timer.cancel();
}
}
private class MyTimer extends TimerTask {
@Override
public void run() {
obiekt.x++;
repaint();
}
}
Ale to chwilę się przemieści i się zatrzymuje... Próbowałem też wprowadzić zmienną logiczną 'wcisniety', ale również coś nie działa:
private class MyKeyListener implements KeyListener {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
wcisniety = true;
while (wcisniety) {
obiekt.x++;
repaint();
}
}
@Override
public void keyReleased(KeyEvent ke) {
wcisniety = false;
}
}
ale również mi to nie działa. Mam wrażenie, że nie do końca rozumiem jak JAVA realizuje wciśnięcie klawisza. Cały czas byłem przekonany, że dopóki klawisz jest wciśnięty, nie dojdzie do wykonania poleceń zawartych w keyReleased, chociaż wydaje mi się że źle to rozumiem...
Dlatego zwracam się z prośbą o POMYSŁ na zrealizowanie przedstawionego problemu. Jeżeli ktoś mógłby podzielić się wiedzą na temat kiedy java widzi wciśnięty klawisz a kiedy jest on 'puszczony' - również z chęcią skorzystam.
Z góry dziękuję,
Quindy