Как передать ключевое событие внутри цикла

У меня проблема.

В моей программе у меня есть 2 класса:

  1. Основной кадр

    public class MainFrame extends javax.swing.JFrame 
    {
    
        Logika logika;
    
        .
        .
        .
    
        private void przyciskKeyPressed(java.awt.event.KeyEvent evt) {
            // TODO add your handling code here:
            char znak = evt.getKeyChar();
            int kod = evt.getKeyCode();
    
    
            if(kod==KeyEvent.VK_A)
            {
                logika.key_pressed("a");
            }
        }
    
    }
    
  2. Логика

    public class Logika {
    
        .
        .
        .
    
    
        Calendar cal = Calendar.getInstance();
    
    
    
    
        public void start()
        {
            gra_rozpoczeta=true;
            punkty=0;
            liczba=1;
            x[0]=251;
            y[0]=301;
    
            cal = Calendar.getInstance();
            czas=cal.getTimeInMillis();
            while(gra_rozpoczeta==true)
            {   
                cal=Calendar.getInstance();
    
                dif=dif-(int)(cal.getTimeInMillis()-czas);
                if(dif<0)
                    akcja();
                try {
                    Thread.currentThread().sleep(50);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Logika.class.getName()).log(Level.SEVERE, null, ex);
                }
                czas=cal.getTimeInMillis();
            }
    
        }
    
        private void akcja()
        {
            dif=500;
    
            liczba++;
            if(liczba==10)
                key_presed=true;
            if(key_presed==true)
                gra_rozpoczeta=false;
        }
    
        public void key_pressed(String s)
        {
            key_presed=true;
            key=s;
        }
    
    }
    

С этими методами у меня проблема.

Цикл длится 5 секунд, но я хочу остановить его раньше, если нажму клавишу «а».

Сейчас работает что: -запуск программы, -цикл последние 5 секунд(нажимаю "а") -Программа реагирует на нажатые клавиши только после цикла

Можно ли сделать?


person user1736332    schedule 10.10.2012    source источник


Ответы (1)


В ваших примерах кода немного не хватает, но я предполагаю, что такое поведение связано с неправильным использованием потоков. Когда ваш мэйнфрейм запускает цикл, он запускает его не в новом потоке, а в основном потоке, который также прослушивает ввод с клавиатуры. Таким образом, во время выполнения цикла ввод с клавиатуры блокируется и обрабатывается только после завершения цикла.

Если вы хотите использовать логику в другом потоке, вы должны изменить ее следующим образом:

public class Logica implements Runnable {
    [...]
    @Override
    public void run() {
        [do loop]
    }
}

и запустите его как новый поток в MainFrame следующим образом:

//start the loop as a new thread...
final Thread thread = new Thread(logika);
thread.start();
//keep listening for keyboard input in the main thread
person Tobb    schedule 10.10.2012