我想询问用户是否可以在继续之前按键。然后我的程序将在10秒内等待。 如果没有做任何事情,那么,我希望能够退出该计划。
我的问题是功能扫描器会阻止我的程序(直到用户按下某个键)并且不允许程序执行结束。
您是否知道我可以做什么/使用什么而不是扫描仪?我只是java的初学者,所以请放纵我。
import java.util.Scanner;
public class Test{
public Test(){
Scanner scan = new Scanner(System.in);
boolean first = true;
System.out.println("Press any key to start.\n");
for(int fr = 0; fr <11; fr++){
System.out.println(fr);
try{
Thread.sleep(1000);
} catch (Exception e) {
System.err.println("error -> "+e.getMessage()); // in case of exception, error message
}
if(fr == 10){
Default def = new Default();
}else if(scan.hasNext() == true){
//System.out.println("Hello");
User user = new User(); // or exit, it doesn't matter
}
}
}
}
答案 0 :(得分:0)
使用KeyListener。
首先制作一个Component,给它焦点,然后添加一个KeyListener。
示例代码:
Component comp = new Componenet();
comp.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
System.out.print("Hello");
}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
});
try {
Thread.sleep(1000);
} catch (Exception e) {
}
System.exit(0);
答案 1 :(得分:0)
可能的解决方案是使用不同的线程来读取扫描仪的用户输入。这是一个示例代码:
Scanner scanner = new Scanner(System.in);
ExecutorService scannerExecutor = Executors.newSingleThreadExecutor();
Future<String> nextLineFuture = scannerExecutor.submit(scanner::nextLine);
/* For Java < 8:
Future<String> nextLineFuture = scannerExecutor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return scanner.nextLine();
}
});
*/
String input;
try {
input = nextLineFuture.get(5, TimeUnit.SECONDS);
}
catch (TimeoutException e) {
input = "Nothing was entered";
}
catch (InterruptedException | ExecutionException e) {
// Handle the exception
return;
}
System.out.println(input);
但是,您需要记住以下问题:
即使nextLineFuture.get(...)
抛出TimeoutException
,nextLine
电话仍会继续投放。如果稍后再次运行scannerExecutor.submit(scanner::nextLine)
,则输入将首先被前一次调用消耗,因此您应确保引用最后创建的结果尚未使用的Future
。< / p>
由于上述问题,如果您需要使用不同的扫描仪方法,例如nextBoolean
,nextInt
等,此方法将无效。但是,您可以始终使用{{ 1}}在主扫描仪上,然后手动解析该行(例如,使用另一台扫描仪)