在 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 正确指出的那样。
相反,您应该使用 类 的状态执行您的逻辑,KeyChecker
或 test
。
我真的不明白为什么你应该定期检查是否按下了一个键(顺便说一句,文本字段的用途),无论如何,下面是一个使用单独线程的可能解决方案。
当然,您也可以在主线程中执行循环( 而不是 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;
}
}
我的问题是我有一个 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 正确指出的那样。
相反,您应该使用 类 的状态执行您的逻辑,KeyChecker
或 test
。
我真的不明白为什么你应该定期检查是否按下了一个键(顺便说一句,文本字段的用途),无论如何,下面是一个使用单独线程的可能解决方案。
当然,您也可以在主线程中执行循环( 而不是 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;
}
}