在Java控制台中退格?

时间:2012-07-26 21:19:29

标签: java console passwords java.util.scanner privacy

有没有办法可以退格并删除用户输入的一些字母/单词?

我正在创建一个单词扰码器游戏,在我制作GUI之前,我正在做一些控制台的东西。 由于我在第一个玩家输入单词时使用扫描仪,因此它会停留在那里。所以第二个玩家可以在猜测混乱的单词时只看它。
反正有没有从控制台删除该单词?或者让它显示为* * * *?
我宁愿没有System.out.println("\n\n\n...."); 这将使输入显示在底部,我希望它在顶部。 我可以删除用户输入的内容或将其显示为* * * * * *吗?
谢谢。 :)

1 个答案:

答案 0 :(得分:1)

请注意,在GUI中执行此操作实际上比使用Scanner IMOP更容易。

使用Scanner执行此操作的一种方法是使用一个线程在输入字符时删除字符并将其替换为*的

<强> EraserThread.java

import java.io.*;

class EraserThread implements Runnable {
   private boolean stop;

   /**
    *@param The prompt displayed to the user
    */
   public EraserThread(String prompt) {
       System.out.print(prompt);
   }

   /**
    * Begin masking...display asterisks (*)
    */
   public void run () {
      stop = true;
      while (stop) {
         System.out.print("\010*");
     try {
        Thread.currentThread().sleep(1);
         } catch(InterruptedException ie) {
            ie.printStackTrace();
         }
      }
   }

   /**
    * Instruct the thread to stop masking
    */
   public void stopMasking() {
      this.stop = false;
   }
}

passwordfield.java

public class PasswordField {

   /**
    *@param prompt The prompt to display to the user
    *@return The password as entered by the user
    */
   public static String readPassword (String prompt) {
      EraserThread et = new EraserThread(prompt);
      Thread mask = new Thread(et);
      mask.start();

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      String password = "";

      try {
         password = in.readLine();
      } catch (IOException ioe) {
        ioe.printStackTrace();
      }
      // stop masking
      et.stopMasking();
      // return the password entered by the user
      return password;
   }
}

主要方法

class TestApp {
   public static void main(String argv[]) {
      String password = PasswordField.readPassword("Enter password: ");
      System.out.println("The password entered is: "+password);
   }
}

我已经测试过并且正在为我工​​作。

更多信息: