【问题标题】:Is there a way to print out a String in console which the user can edit?有没有办法在控制台中打印出用户可以编辑的字符串?
【发布时间】:2015-09-24 22:09:56
【问题描述】:

我的问题是关于 Java 的。

有没有办法在使用 Scanner 时在控制台中打印出一个字符串,以便用户可以对其进行编辑和/或添加更多内容?

例如...

String aString = "Hello!"
System.out.println("Write some text, please.");
aString = scanner.nextLine();

现在我想要某种 System.out of aString 但可编辑。我希望用户能够简单地编辑 aString。当用户完成编辑后,Scanner 会将所有内容再次保存到 aString 中。

我现在的解决方案是让用户输入一些新文本,然后将其添加到字符串的末尾:

    aString += scanner.nextLine();

感谢任何帮助。谢谢。

【问题讨论】:

    标签: java string console


    【解决方案1】:

    您可以使用 Robot 类来实现您想要的。例如,尝试以下操作:

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.util.Scanner;
    
    public class RobotText {
    
        static private Robot robot;
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            System.out.println("Enter some text, blank line to end.");
            int count = 1;
            while (true) {
                System.out.print("?>");
                insert("Line " + count);
                count++;
                String line = input.nextLine();
                if (line.length() == 0) break;
                System.out.println("You entered '" + line + "'");
            }
            System.out.println("That's all folks!");
            input.close();
        }
    
        private static void insert(String text) {
            if (robot == null) {
                // Lazily initialise the robot
                try {
                    robot = new Robot();
                    robot.setAutoDelay(5);
                    robot.setAutoWaitForIdle(true);
                } catch (AWTException e) {
                    e.printStackTrace();
                }
            }
            char[] chars = text.toCharArray();
            for (char c : chars) {
                int code = KeyEvent.getExtendedKeyCodeForChar(c);
                robot.keyPress(code);
                robot.keyRelease(code);
            }
        }
    }
    

    这会在使用扫描仪读取结果行之前插入您希望用户作为击键编辑的文本。注意 - 不要插入换行符,否则用户将永远没有机会输入!

    不幸的是,您仍将受制于运行应用程序的 shell 提供的任何行编辑功能。在我的情况下,这意味着用户可以对上述内容进行的所有操作都是在重新输入替换之前根据需要在预先输入的文本上退格。

    为避免这种情况,您需要将 Scanner 的使用替换为更复杂的东西。我还没有尝试过,但看起来JLine 可以满足您的需求。

    对于极端的过度杀伤,在可以运行 GUI 的环境中,或者如果由于某种原因您无法将新 jars 添加到类路径中,您也可以使用 JOptionPane 进行输入:

        ...
        while (true) {
            String line = JOptionPane.showInputDialog("Enter some text","Line "+count);
            count++;
            if (line == null || line.length() == 0) break;
            System.out.println("You entered '" + line + "'");
        }
        ...
    

    这确实为每一行输入启动了一个新的 Swing Event 线程,然后再次将其关闭,所以它确实是在使用大炮杀死苍蝇!但当然它要求在控制台的单独窗口中输入,这可能与您的目标相差太远。

    最终的答案是为您的应用程序提供一个图形界面,因为我遇到的每个工具包提供的每个文本输入小部件都允许您使用随后可以由用户编辑的文本来预初始化小部件。我将把工具包的选择和实现留给读者作为练习。 :)

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 2010-11-25
      • 2011-03-07
      • 2020-01-31
      • 2021-10-28
      • 2016-07-23
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多