【问题标题】:How to read in an "Enter"/"Return"如何读入“Enter”/“Return”
【发布时间】:2016-03-25 08:23:17
【问题描述】:

当用户输入 Enter/Return 键时,我想退出 while 循环。

这是我的代码:

do
{
    //id=sclocal.nextInt();        
    try{
        id=sclocal.nextInt();
    }catch(InputMismatchException exception)
    {         
        System.out.println("Invalid input!");
        return;
    }

    if(listperformer.size() <= id || id < 0)
    {
        System.out.println("Invalid input!");
        return;
    }
    else
    {
        idlist.add(listperformer.get(id));
    }

}while(sclocal.nextLine().length() > 0);  //Here I want: *

*如果用户不想输入另一个id,他们不输入任何其他内容并按“Enter”退出此循环。

【问题讨论】:

  • 我假设你的意思是叶子而不是叶子?
  • 是的,对不起!叶子 = 叶子 ;-)
  • 为什么是“输入/返回”而不是字符串输入或类似的东西?只是好奇
  • 除了@TomC 的问题外,用户还必须按Enter 键才能发送输入。您的意思是检查空输入吗?例如:""
  • 如何从控制台发送输入键?不按“Enter”?

标签: java while-loop user-input


【解决方案1】:

如果您正在使用JFrame 或其他摆动组件,您可以执行与此示例类似的操作。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame {
    private JPanel testPanel = new JPanel(new GridBagLayout());
    private GridBagConstraints c = new GridBagConstraints();
    private JLabel label1 = new JLabel("0");
    boolean bool = true;

    Test() {
        super("Swing Example");
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        buildGUI();
        c.weightx = 1.0;
        c.gridx = 0;
        c.gridy = 0;
        add(testPanel, c);
        pack();
        setFocusable(true);
        addKeyListener(new CustomKeyListener());
        setVisible(true);
        run();
    }

    private void buildGUI() {
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        testPanel.add(label1, c);
    }

    private void run() {
        int i = 0;
        do {
            i++;
            label1.setText(i+"");
            repaint();
            revalidate();
            validate();
            try {
                Thread.sleep(1000);
            } catch (Exception e) {

            }
        } while(i<100 && bool);
    }

    public static void main(String[] args) {
        new Test();
    }

    private class CustomKeyListener implements KeyListener
    {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                bool = false;
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {

        }

        @Override
        public void keyTyped(KeyEvent e) {

        }
    }
}

但是,如果您使用的是命令行或其他控制台,请查看此answer。因为这将允许您检查返回键,而无需暂停 while 循环以等待来自控制台的输入

【讨论】:

    【解决方案2】:

    问题是你想要的是一个 KeyListener。但是,这仅适用于 Swing 类和开发 GUI 应用程序。

    除此之外,正如其他人所说,如果“Enter/Return”键结束应用程序,用户如何输入输入?

    因此,您可能不得不寻找其他方法来实现这一目标,这可能是最好的方法;

    Scanner scanner = new Scanner(System.in);
    String userInput;
    boolean quit = false;
    
    do {
        userInput = scanner.nextLine();
    
        switch (userInput)
        {
            case "check1":
                System.out.println( "check 1" );
                break;
            case "check2":
                System.out.println( "check 2" );
                break;
            case "quit":
                quit = true;
                break;
            default:
                System.out.println( "Incorrect" );
                break;
        }
    }while (!quit);
    

    如果您想检查一个 int 用户输入的值,那么您可以简单地更改 userInput 类型,如下所示:

    Scanner scanner = new Scanner(System.in);
    int userInput;
    boolean quit = false;
    
    do {
        userInput = scanner.nextInt();
    
        switch (userInput) 
        {
            case 1:
                System.out.println("check 1");
                break;
            case 2:
                System.out.println("check 2");
                break;
            case 0:
                quit = true;
                break;
            default:
                System.out.println("Incorrect");
                break;
        }
    }while (!quit);
    

    【讨论】:

      【解决方案3】:

      扫描仪默认使用\p{javaWhitespace}+作为分隔符,这意味着一个或多个空格,但像\r\n这样的行分隔符也被视为空格,因此对于像

      这样的数据
      1\r\n
      \r\n
      0\r\n
      

      代码:

      int i1 = scanner.nextInt();
      int i2 = scanner.nextInt();
      int i3 = scanner.nextInt();
      

      将返回

      1
      0
      ..here scanner will be waiting for next integer since stream is still opened
      

      现在您面临的问题是 nextInt() 在读取数据时不会使用行分隔符 \r \n 所以下一次调用 nextLine() 只会返回在扫描仪能够找到这些分隔符之前存在的字符串。
      在这个例子的情况下(也可能在您的用户输入的情况下)这意味着在您的while 条件中使用的nextLine 将始终返回空字符串。

      您可能认为解决此问题的方法是通过在每个nextInt 之后添加nextLine 将光标移动到下一行。但这并不容易,因为

      • nextInt 仍然会忽略行分隔符,因为它们是空格,并且输入流仍处于打开状态,
      • nextLine() 的另一个调用将读取整行,对于像 1\r\n0\r\n 这样的数据也将消耗 0

      可能的解决方案:

      由于nextInt 将忽略任何空格,您将无法使用此方法,同时使用空行作为数据结尾的表示。所以你有两个解决方案

      1. 使用预定义的序列作为输入数据结束的表示,例如

        Scanner sc = new Scanner(System.in);
        System.out.println("give me id: ");
        while(!sc.hasNext("exit")){
            if (sc.hasNextInt()){
                int id = sc.nextInt();
                //handle that id
            }else{
                System.out.println("Invalid input!");
                //now either consume incorrect value to let scanner move to next one
                sc.next();
                //OR break entire loop
                //break;
                //           or method 
                //return;
            }
            System.out.println("give me id: ");
        }
        System.out.println("out of loop");
        
      2. 逐行读取输入并手动解析(我可能会避免这种解决方案)

        Scanner sc = new Scanner(System.in);
        String line = "";
        do {
            System.out.println("give me id: ");
            line = sc.nextLine();
            Scanner tmpScanner = new Scanner(line);
            if (tmpScanner.hasNextInt()){
                int id = tmpScanner.nextInt();
                //handle that id
            }else{
                System.out.println("Invalid input!");
                //you can let loop continue or break it by 
                // line = "";
            }
        
        } while (!line.isEmpty());
        System.out.println("out of loop");
        

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 2011-07-22
        • 2022-11-30
        • 2011-09-15
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        相关资源
        最近更新 更多