簡體   English   中英

"在 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 )執行您的邏輯。 我真的不明白為什么你應該定期檢查被按下的鍵(以及文本字段 BTW 的目的),無論如何,以下是使用單獨線程的可能解決方案。 當然,您也可以在主線程(不是EDT)中執行循環,但在非平凡的應用程序中,您永遠不應該這樣做。

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM