0

我有个问题。

在我的程序中,我有 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 秒时循环,但如果我按“a”键,我想提前停止它。

现在它正在工作:-程序开始,-循环最后 5 秒(我按“a”)-程序仅在循环后响应按下的键

有可能吗?

4

1 回答 1

0

您的代码示例有点缺乏,但我猜这种行为是由于线程使用不当造成的。当您的大型机启动循环时,它不会在新线程中启动它,而是在主线程中启动它,主线程也在监听键盘输入。因此,当循环运行时,键盘输入被阻止,并且仅在循环完成后处理。

如果你想在不同的线程中使用 logica,你必须把它改成这样:

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
于 2012-10-10T22:22:49.037 回答