在 for 循环中无法读取来自 jtextfield 的输入

Input from jtextfield doesnt get read while in a for loop

我的问题是我有一个 for 循环,虽然这个循环是 运行 我仍然希望读取来自 JTextField 的输入,而不是在打印行时中断循环或计时。

public class test {

    public void Play() {

        JTextField textField = new JTextField();
        textField.addKeyListener(new KeyChecker());
        JFrame jframe = new JFrame();
        jframe.add(textField);
        jframe.setSize(200, 30);
        jframe.setVisible(true);
    }
}

class KeyChecker extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent event)
    {
        for(int i = 0; i < 1; i = 0)
        {
            char Input = event.getKeyChar();
            if(Input == 'a')
            {
                System.out.println("working");
            } else {
                System.out.println("not working");
            }
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException ex)
            {
                Thread.currentThread().interrupt();
            }
        }
    }
}

在您的代码中,每当您在文本字段中按下一个键时,事件调度线程 (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html) 都会调用 keyPressed 方法。

在这种情况下,KeyEvent event 参数代表一个单一的按键事件,因此在事件方法中创建循环是没有意义的,正如 maloomeister 正确指出的那样。

相反,您应该使用 类 的状态执行您的逻辑,KeyCheckertest。 我真的不明白为什么你应该定期检查是否按下了一个键(顺便说一句,文本字段的用途),无论如何,下面是一个使用单独线程的可能解决方案。 当然,您也可以在主线程中执行循环( 而不是 EDT),但在 non-trivial 应用程序中,您永远不应该这样做。

import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test {
    public static void main(String[] args) {
        KeyChecker keyChecker = new KeyChecker();
        JTextField textField = new JTextField(40);
        textField.addKeyListener(keyChecker);
        JFrame jframe = new JFrame();
        jframe.add(textField);
        jframe.pack();
        jframe.setVisible(true);

        Thread t = new Thread(() -> {
            while(true) {
                char currentKey = keyChecker.getCurrentPressedKey();
                switch (currentKey) {
                    case 'a':
                        System.out.println("working");
                        break;
                    default:
                        System.out.println("not working");
                }
                    
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    break;
                }
            }
        });
        
        t.start();
    }
}

class KeyChecker extends KeyAdapter {
    private char currentPressedKey = 0;

    @Override
    public void keyPressed(KeyEvent event) {
        currentPressedKey = event.getKeyChar();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        currentPressedKey=0;
    }
    
    public char getCurrentPressedKey() {
        return currentPressedKey;
    }
}